【问题标题】:emacs: Is it possible to match strings with balanced parens with emacs regex?emacs:是否可以使用 emacs 正则表达式匹配带有平衡括号的字符串?
【发布时间】:2011-02-11 21:08:41
【问题描述】:

类似这样的:
http://perl.plover.com/yak/regex/samples/slide083.html

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

我看到在 perl 中是可能的,and in .NET。在 emacs 正则表达式中可以吗?

【问题讨论】:

  • 哈!所以很有趣。当我搜索更多关于此的提示时,在谷歌中输入“emacs regex balance”,我得到 this question 作为第一个命中。嘿嘿。

标签: regex emacs


【解决方案1】:

如果您仍然感兴趣,请查看cexp.el

这只是一个 hack,但也许能达到你的目的。

您可以使用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}

【讨论】:

  • 考虑通过引用页面的一些摘录来扩展您的答案。请参阅How to Answer 了解为什么裸链接不被视为好答案的详细信息。
【解决方案2】:

不,但如果您有特定的用例要讨论,您通常会发现您不需要正则表达式。用 lisp 编写匹配括号的简单状态机非常简单。查看 Paredit 的源代码是一个很好的起点。

【讨论】:

  • 是的,就我而言,paren 解析已经完成。它在 cc-mode 内,所以我可以使用 (forward-sexp) 在任一侧进行正则表达式匹配。我只是希望能够用一个正则表达式来做到这一点。
【解决方案3】:

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

【讨论】:

  • Mmkay,尽管这不是我想要的答案,但你得到了支持。
  • 是的,对不起。但我完全不确定递归正则表达式是否是一件好事。如果没有这些,它们可能会变得足够复杂。与正则表达式结合的解析器对我来说看起来更明智。
  • 呸!已经扩展到可以做到这一点的“正则表达式”实际上不再是“正则”了。并不是说这必然是一件坏事,而是该工具的发展已经使术语过时了。
  • @Cheeso:“正则表达式”这个词多年来一直在延伸。真正的正则表达式不允许反向引用或环视,因为它们不再是“常规的”。递归只是扩展正则表达式功能的另一个额外功能 - 理论计算机科学家可能会对术语感到不寒而栗......
  • @Cheeso:正如蒂姆所说,“常规”实际上是指一个非常具体的东西。而无法匹配嵌套深度实际上是正则定义的一部分。 (en.wikipedia.org/wiki/…)。不过公平地说,正则表达式引擎的名字已经被错误命名至少一两年了。
猜你喜欢
  • 2010-10-07
  • 1970-01-01
  • 2011-12-19
  • 1970-01-01
  • 2015-11-04
相关资源
最近更新 更多