Я думаю, что регулярные выражения недостаточно мощны, чтобы делать то, что вы хотите здесь; вы хотите удалить все пробелы, найденные между символами скобок. Проблема в том, что решение этого для общего случая означает, что вы выполняете контекстно-зависимое соответствие строки, а регулярные выражения в основном нечувствительны к контексту и поэтому не могут выполнять вашу работу. Есть lookaheads и lookbehinds , которые могут ограничивать совпадения с конкретными контекстами, но они не будут решать вашу проблему в общем случае:
Содержащийся шаблон должен соответствовать только строки некоторой фиксированной длины, что означает, что
blockquote>abc
илиa|b
разрешены, ноa*
иa{3,4}
- нет. Ссылки группы не поддерживаются, даже если они соответствуют строкам некоторой фиксированной длины.Из-за этого я сначала сопоставлял бы группы скобок:
>>> re.split(r'(\([^)]*\))', res) ['', '(321, 3)', '-', '(m-5, 5)', ' -', '(31,1)', '']
, а затем удалите пробелы из них на втором шаге перед тем, как
join
все вернется в одну строку:>>> g = re.split(r'(\([^)]*\))', res) >>> g[1::2] = [re.sub(r'\s*', '', x) for x in g[1::2]] >>> ''.join(g) '(321,3)-(m-5,5) -(31,1)'
Благодаря eric и ответам Juan Manuel, я смог выяснить, что транзакция не фиксировалась.
Добавление @Transactional к storeAccount методу добилось цели!
Вы не должны явно называть сохранять метод. Операция слияния записала бы изменения в DB на фиксацию.
Вероятно, Вы сохраняете транзакцию активной, и она не называет "фиксацию" до другого выполнения методов, поддерживающего конец активной транзакции (все "голосование" за фиксацию и ни один для отката.)
, Если Вы уверены, что объект собираетесь сохраниться, в порядке, Вы могли, вероятно, сделать это:
@TransactionManagement(TransactionManagementType.BEAN)
public class AccountManager implements IAccountManager { ..}
и справляются с Вашим добавлением постоянства объекта:
@Resource
private SessionContext sessionContext;
public Account storeAccount(Account ac) {
sessionContext.getUserTransaction().begin();
ac = em.merge(ac);
em.persist(ac);
sessionContext.getUserTransaction().commit();
return ac;
}