Замена регулярных выражений на Emacs - PullRequest
8 голосов
/ 30 июня 2009

Я пытаюсь выполнить поиск и заменить его на регулярные выражения .

Предположим, у меня есть foreach(foo1.txt, foo2.txt, foo3.txt, foo4.txt). И я хочу поставить "вокруг каждого элемента в списке.

Я подумал - из документации - что это регулярное выражение будет работать (foo[1-4]\.txt) -> "\&".

Но это не так. Что я делаю не так?

Ответы [ 4 ]

8 голосов
/ 30 июня 2009

Обратите внимание, что скобки и скобки необходимо экранировать ("лишние косые черты") в поиске регулярных выражений, но не в replace регулярных выражениях.

Экранирование требуется, потому что парсер lisp видит регулярное выражение перед механизмом регулярных выражений.

Но, если вы пишете программно (в отличие от интерактивного ввода), вам нужно избежать побегов! ай-ух-ух ....

interactive:
M-x replace-regexp RET \(obj.method(.*)\{1\}\) RET trim$(\1)

programmatic:
(replace-regexp "\\(obj.method(.*)\\{1\\}\\)" "trim$(\\1)")

сбежавшие парены сбежали, потому что они группируются, не спасшиеся парнины - буквальные парены.

Возможно, вы захотите посетить ускоренный курс Emacs Wiki Regex и Раздел регулярных выражений Стива Йегге Emacs .

2 голосов
/ 30 июня 2009

Регулярные выражения Emacs всегда меня ловят, потому что они не Perl:

\(foo[1-4]\.txt\)

Вам нужно заключить в скобки в Emacs обратную косую черту.

2 голосов
/ 30 июня 2009

Попробуйте что-то вроде этого \(foo[1-4]\.txt\)

1 голос
/ 30 июня 2009

Вы уже получили правильный ответ о регулярном выражении, но в этом случае, вероятно, вместо этого будет проще использовать макросы. Поставьте точку в начале имени и введите:

C-x ( " M-f M-f " C-f C-f C-x )

То есть начать запись макроса, вставить кавычку, перейти на два слова вперед, вставить кавычку, перейти на два символа вперед для следующего элемента и остановить запись макроса.

Затем запустите макрос с C-x e. Чтобы повторить, просто нажмите e снова.

(В Emacs 23 вы можете использовать F3 вместо 'C-x (' и F4 вместо 'C-x )' и 'C-x e'.)

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