emacs:是否可以将带有平衡parens的字符串与emacs正则表达式匹配?

时间:2010-04-24 14:09:35

标签: regex emacs

这样的事情:
  http://perl.plover.com/yak/regex/samples/slide083.html

换句话说,我想在{ { foo } { bar} }上成功匹配,但不想在{ { foo }上匹配。

我认为perl可能是and in .NET。是否可以在emacs正则表达式?

3 个答案:

答案 0 :(得分:7)

不,到目前为止,Perl / PCRE和.NET是唯一支持任意嵌套(递归模式)的正则表达式。

答案 1 :(得分:2)

不,但是如果你有一个特定的用例来讨论你,你会经常发现你不需要正则表达式。在lisp中编写简单的状态机来匹配父对象很简单。看看Paredit的来源是一个很好的起点。

答案 2 :(得分:1)

如果您仍有兴趣,请查看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通过cexp-search-forward进行搜索会返回以下组的限制:

  1. 完整比赛的开始和结束
  2. 平衡表达式之前正则表达式匹配的限制,即\def\mdo#1
  3. 第一个正则表达式中捕获的组的限制,即#1
  4. 平衡表达式的限制,即{{\def\next{\relax}\def\tmp{#1}\ifx\next\tmp\else\def\next{#1\mdo}\expandafter}\next}