emacs: можно ли сопоставить строки с сбалансированными паренами с помощью emacs regex? - PullRequest
8 голосов
/ 24 апреля 2010

Примерно так:
http://perl.plover.com/yak/regex/samples/slide083.html

Другими словами, я хочу успешно сопоставить на { { foo } { bar} }, но не на { { foo }.

Я вижу, что это возможно в Perl, и в .NET . Возможно ли это в emacs regex?

Ответы [ 3 ]

7 голосов
/ 24 апреля 2010

Нет, пока Perl / PCRE и .NET - единственные разновидности регулярных выражений, которые поддерживают произвольное вложение (рекурсивные шаблоны).

2 голосов
/ 24 апреля 2010

Нет, но если у вас есть конкретный вариант использования для обсуждения, вы часто обнаружите, что вам не нужны регулярные выражения. Простые конечные автоматы для соответствия скобкам довольно просто написать в lisp. Глядя на источник Paredit, это хорошее место для начала.

1 голос
/ 07 февраля 2012

Если вы все еще заинтересованы, взгляните на cexp.el .

Это просто взлом, но, возможно, служит вашей цели.

Вы можете искать объединенные регулярные и сбалансированные выражения с помощью cexp-search-forward. Встроенный re-search-forward используется для регулярных выражений, поэтому применяются правила синтаксиса. Сбалансированные выражения можно сопоставить с дополнительными элементами синтаксиса \!( и \!).

Самым серьезным ограничением является то, что сбалансированные выражения могут не встречаться в группах. Таким образом, конструкция типа \!(^{ \(\!(^{.*}$\!)\)+ }$\!) не работает из-за группы, содержащей внутреннее сбалансированное выражение.

Тем не менее, один полезный пример - сопоставление определений TeX, таких как

\def\mdo#1{{\def\next{\relax}\def\tmp{#1}\ifx\next\tmp\else\def\next{#1\mdo}\expandafter}\next}

с объединенными выражениями, такими как

\\def\\[[:alpha:]]+\(#[0-9]\)*\!(^{.*}$\!)

Поиск по cexp-search-forward с указанным выше cexp возвращает ограничения для следующих групп:

  1. Начало и конец полного матча
  2. Пределы соответствия для регулярного выражения перед сбалансированным выражением, т.е. \def\mdo#1
  3. Пределы захваченной группы в первом регулярном выражении, т.е. #1
  4. Пределы сбалансированного выражения, т. Е. {{\def\next{\relax}\def\tmp{#1}\ifx\next\tmp\else\def\next{#1\mdo}\expandafter}\next}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...