2015-10-14 2 views
1

У меня есть около 200 вызовов функций видаJava Regex для вложенности вызовов функций

markers.add(packageDecl.getPosition(), "package.invalid", this.fullName); 

, которые должны быть заменены

markers.add(I18n.createMarker(packageDecl.getPosition(), "package.invalid", this.fullName)); 
      ^^^^^^^^^^^^^^^^^^               ^

Они могут иметь произвольное число аргументов функции и аргументы могут быть вложенными вызовами, как показано в примере. Однако дается то, что ; всегда преуспевает в новой строке.


Я уже пытался это регулярное выражение:

markers\.add\((.*)$ 

, который позволяет мне раздеть markers.add( часть и добавить I18n.createMarker(. Однако я не могу добавить дополнительную закрывающую скобку в конце: ); ->));.

ответ

1

Вы можете не использовать эту функцию:

Regex: markers\.add\((.*)\)" 
Replace: markers.add(I18n.createMarker(\1)) 
0

Это уродливая вещь похоже на работу с Eclipse, регулярное выражение находке:

markers\.add\((.|\n)*;$ 
+0

Вы должны посмотреть режим DOTALL в регулярных выражений документации Java. Нет необходимости в таких хаках, как '(. | \ N)'. –

+0

@AlanMoore Я знаю о флагах регулярных выражений, но я не думаю, что поиск/замещение регулярного выражения, упомянутое Clashsoft в комментарии, поддерживает их. Я ошибаюсь? – Aaron

+1

Вопрос помечен тегом [tag: java], поэтому я предположил, что это был код Java, и он использовал только Eclipse для тестирования. Но независимо от того, сам Eclipse использует библиотеку ICU, которая имеет почти точно такой же синтаксис и семантику, что и Java-вкус (преднамеренный выбор дизайна). О, и есть еще одна проблема с '(. | \ N)'. Есть несколько других разделителей строк, которые '.' не совпадают, поэтому технически вы должны были использовать. '(|. [\ Г \ п \ u0085 \ u2028 \ u2029])'. Если вы идете по этому маршруту. Который не должен. –

Смежные вопросы