Временная граница Emacs regex (в частности, подчеркивание)
Я пытаюсь заменить все вхождения целого слова на emacs (скажем, foo), используя M-x replace-regexp.
Проблема в том, что я не хочу заменять вхождения foo в подчеркнутых словах, таких как word_foo_word
Если я использую \bfoo\b для соответствия foo, то он будет соответствовать подчеркнутым строкам; потому что, как я понимаю, emacs считает, что подчеркивания являются частью границ слова, что отличается от других систем регулярных выражений, таких как perl.
Каким будет правильный способ?
Спасибо
Ответы
Ответ 1
Регулярное выражение \<foo\>
или \bfoo\b
соответствует foo
только тогда, когда ему не предшествует или не следует текстовый составной символ (код синтаксиса w
, обычно alphanumerics, поэтому он соответствует foo_bar
, но не в foo1
).
Так как Emacs 22, regexp \_<foo_bar\_>
соответствует foo_bar
только тогда, когда ему не предшествует или не следует символьный составной символ. Компонент символа является либо составной частью слова, либо символом с синтаксисом _
. Большинство режимов программирования определяют _
как составляющую символа.
Ответ 2
Вы писали:
поскольку я понимаю, что emacs считает, что подчеркивания являются частью границ слова, которая отличается от других систем регулярных выражений
Обработка подчеркивания, как и все остальное в emacs, настраивается. Этот вопрос:
Как сделать передовое слово, обратное слово, рассматривать подчеркивание как часть слова?
... спрашивает обратное.
Я думаю, вы могли бы решить свою проблему, изменив синтаксис подчеркивания в таблице синтаксиса, чтобы они не были частью слов, а затем выполняли поиск/замену.
Для этого вам нужно знать, какой режим вы используете, и имя таблицы синтаксиса для этого режима. В С++ это будет так:
(modify-syntax-entry ?_ "." c++-mode-syntax-table)
Точка обозначает "пунктуацию", которая подразумевает не часть слова. Подробнее об этом попробуйте M-x describe-function
на modify-syntax-entry
.