2014-02-18 3 views
2

Использование Emacs в злом режиме, у меня возникают проблемы с регулярными выражениями, которые включают \_, например, например,Emacs в злых режимах и регулярных выражениях

/TAG1\_.\{-}TAG2 
/TAG1\_s*TAG2 

Например, первое регулярное выражение используется в Vim, чтобы найти какой-либо блок текста между TAG1 и TAG2, включая пробелы и новые строки. Он будет соответствовать, например,

TAG1 
text 

more text TAG2 

Однако в Emacs лукавого режиме, как только я печатаю \_, я получаю сообщение об ошибке в Premature end of regular expression. Другие поиски без \_, как

/TAG1\n*TAG2 

работы, как и следовало ожидать, так что проблема именно с \_. Я попытался немного поиграть со злыми настройками группы, но безрезультатно. Любой намек, где проблема может лежать?

P.S .: Проблема имеет место независимо от того, пользуюсь ли я графическим интерфейсом или нет. В Vim я не получаю никаких проблем

+0

Что это такое, когда выражение просто '\ _'? – sln

+0

'-' обычно не требуется. Некоторые самодельные двигатели используют такие функции, как это означает meta (пример '\ <' - начало границы слова) – sln

+0

Когда выражение просто '/ \ _', оно говорит' Неполный вход'. Если '_' используется без экранирования, он рассматривается как любой другой символ, как и ожидалось: например. '/ TAG1_s * TAG2' находит строку' TAG1_sTAG2' (но я хочу найти 'TAG1 TAG2'!) – summer

ответ

3

Это не проблема со злым режимом, в регулярных выражениях emacs \ имеет особое значение. Из Emacs manual

\ имеет две функции: он цитирует специальные символы (включая «\») и вводит дополнительные специальные конструкции.

Потому что '\' цитирует специальные символы, '\ $' - это регулярное выражение, которое соответствует только $, и '[' является регулярным выражением, которое соответствует только '[' и т. Д.

Вам придется спасаясь от \, поэтому для поиска TAG\ вам нужно будет ввести регулярное выражение TAG\\

Вы можете найти this страницу полезной для изучения Elisp регулярных выражений.

+0

Спасибо за ваш ответ, Iqbal. Однако я НЕ ищу 'TAG \'. Регулярное выражение типа '/ TAG1 \ _s * TAG2' в Vim пытается найти последовательность' TAG1TAG2', где 'TAG1' и' TAG2' могут быть разделены любым количеством пробелов или новых строк. Это поведение, которое я хочу в злобном режиме ... и это не достигается, ускоряясь, т. Е. '/ TAG1 \\ _ s * TAG2' не работает.Для ясности я редактировал свой оригинальный вопрос. Еще раз спасибо за ссылку, я смотрю на нее, может быть, я найду решение там. – summer

+0

@summer Для соответствия новой строке в поиске-замене вам нужно будет ввести Cq Cj, поэтому регулярное выражение может быть 'TAG1 [[: space:]^J] * TAG2' (нажмите Cq Cj, чтобы ввести^J) –

1

Если, как вы говорите в своем ответе на @Iqbal, вы пытаетесь соответствовать TAG1, а затем ноль или более пробелов или символов новой строки символов, а затем TAG2, то в Emacs регулярное выражение для этого записывается следующим образом: TAG1[ \n]*TAG2.

И да, вы обязаны сделать это самостоятельно, чтобы прочитать раздел регулярного выражения руководства. Различные языки обрабатывают регулярные выражения по-разному, а Emacs Lisp не является исключением из этого правила.

+1

Спасибо за ваш ответ @Drew. Конечно, не то, что я хотел сохранить себе дело с чтением раздела Emacs regexp. Конфликтом было то, что я думал, что, поскольку я использовал злой режим, мне приходилось обрабатывать регулярные выражения точно так же, как в Vim (я довольно новый пользователь Emacs). Я вижу, что это не так, и я благодарю вас и Икбала за то, что указал мне в правильном направлении. – summer

+1

Нет проблем; Я понимаю. В общем, Emacs имеет свой собственный способ делать вещи - иногда по прекрасным причинам, иногда в основном для «истерических изюмин». Но одна вещь, на которую Emacs хорошо справляется, помогает вам это понять. Мой первый совет любому, кто знаком с Emacs, заключается в следующем: *** Спросите Emacs ***. В течение почти 40 лет он рекламировал себя как «самодокументирующийся», доказательство того, что объяснение себя - это то, что, по крайней мере, относится к нему серьезно. И обычно это очень хорошо. Шлюз изучает то, что доступно с 'C-h C-h', и как обойтись в двух руководствах Emacs. Наслаждаться. – Drew

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