eclipse - regex: заменить несколько групп - PullRequest
5 голосов
/ 18 октября 2010
someText
1
2
3
4
moreText

Я хотел бы добавить префикс перед каждой цифрой.

, но использование (\w+\R)(\d+\R)+(\w+) и \1prefix\2\3 только префикс последней цифры и стереть другие.

IsЕсть ли способ сделать это с помощью одного регулярного выражения или я должен написать скрипт на стороне?

1 Ответ

5 голосов
/ 18 октября 2010

Проблема с вашим регулярным выражением заключается в использовании жадного сопоставления в (\d+\R)+, особенно в последнем +. Это гласит: «Сопоставьте эту группу столько раз, сколько сможете, пока это не приведет к пропаданию матча». Таким образом, для вашего текста он сжимается на 1, 2, 3 и 4, прежде чем он больше не может сожрать, и помещает последнее совпадение во вторую группу захвата. Очевидно, что движкам регулярных выражений свойственно быть неспособным выражать вариадические группы, как бы вы в них обратились? Таким образом, короткий ответ, я думаю, состоит в том, что регулярные выражения являются неподходящим инструментом для полностью автоматизированного процесса, и вам придется написать скрипт.

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

find: (\w+\R)((?:\d+\R)+)(\w+)
replace: \1prefix\2\3

Мы обертываем вторую группу плюс ее жадный модификатор в дополнительный набор захватывающих паренов и заключаем соответствующий текст в не захватывающую группу. Теперь у нас есть полный набор цифр в их собственной группе и мы можем добавить префикс к первой. Интересным побочным эффектом этого является то, что первое число затем соответствует первой группе (\w+\R), и если вы снова запустите поиск / замену, оно попадет на следующее число в строке, пока не перестанет совпадать.

Таким образом, вы сможете просматривать свои файлы, по крайней мере, только в тех областях, к которым вы хотите добавить этот префикс, и это не займет почти столько же времени, как и поиск каждой цифры в каждом файле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...