Emacs Regex WordWord Граница (в частности, подчеркивания) - PullRequest
15 голосов
/ 09 мая 2011

Я пытаюсь заменить все вхождения целого слова в emacs (скажем, foo), используя Mx replace-regexp.

Проблема в том, что я не хочу заменять вхождения foo в подчеркнутых словах, напримерas word_foo_word

Если я использую \ bfoo \ b для сопоставления с foo, тогда он будет соответствовать подчеркнутым строкам;потому что, как я понимаю, emacs рассматривает подчеркивания как часть границ слов, что отличается от других систем RegEx, таких как Perl.

Каков будет правильный путь для продолжения?

Ответы [ 2 ]

12 голосов
/ 09 мая 2011

Регулярное выражение \<foo\> или \bfoo\b соответствует foo только в том случае, если перед ним не стоит предшествующий символ слова или за ним не следует ( синтаксический код w, обычно буквенно-цифровые, поэтому оно соответствует foo_bar но не в foo1).

Начиная с Emacs 22, регулярное выражение \_<foo_bar\_> соответствует foo_bar только в том случае, если за ним не предшествует символ, составляющий символ. Составной частью символа является составная часть слова или символ с синтаксисом _. В большинстве режимов программирования _ определяется как символьная составляющая.

5 голосов
/ 09 мая 2011

Вы писали:

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

Обработка символов подчеркивания, как и всего в emacs, настраивается. Этот вопрос:
Как заставить прямое слово, обратное слово трактовать подчеркивание как часть слова?

... спрашивает обратное.

Я думаю, вы могли бы решить вашу проблему, изменив синтаксис подчеркиваний в таблице синтаксиса, чтобы они не были частью слов, а затем выполнив поиск / замену.

Для этого вам нужно знать используемый вами режим и имя таблицы синтаксиса для этого режима. В C ++ это было бы так:

(modify-syntax-entry ?_ "." c++-mode-syntax-table)

Точка обозначает «пунктуацию», что означает , а не часть слова . Подробнее об этом попробуйте M-x describe-function на modify-syntax-entry.

...