Emacs:是否可以使用Emacs正则表达式匹配具有平衡括号的字符串?

8

1
哈!SO很有趣。当我在谷歌上搜索更多关于“emacs regex balanced”的提示时,我发现这个问题是第一个搜索结果。嘿嘿。 - Cheeso
3个回答

8

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


是的,抱歉。但我不确定递归正则表达式是否是一件好事。它们已经足够复杂了,没有必要再加上这个。对我来说,将解析器与正则表达式结合起来更有意义。 - Tim Pietzcker
1
呃!已经扩展到可以做到这一点的“正则表达式”实际上不再是“正则”的了。这并不一定是件坏事,但工具的演变使术语过时了。 - dmckee --- ex-moderator kitten
@dmckee,什么使得正则表达式“正则”?当你说“不正则”时,你是指扩展不被广泛支持吗?我同意这一点。但我不知道递归或者进行平衡匹配的能力是否算作扩展,或者是否也不被支持。这就是为什么我问的原因。@Tim,我认为你是对的,我可能会这样做。 - Cheeso
2
@Cheeso:多年来,“正则表达式”这个术语已经被扩展了。一个真正的正则表达式不会允许反向引用或环视,因为它们不再是“规则”的了。递归只是另一个额外的功能,扩展了正则表达式的能力 - 一个理论计算机科学家可能会对这个术语感到震惊... - Tim Pietzcker
1
@Cheeso: 正如Tim所说,“Regular”实际上指的是一件非常具体的事情。而且无法匹配嵌套深度实际上是“正则”的定义的一部分。(http://en.wikipedia.org/wiki/Regular_language#Deciding_whether_a_language_is_regular) 不过公平地说,正则表达式引擎已经被错误地命名了至少十年或二十年。 - quodlibetor
显示剩余2条评论

2
如果您仍然感兴趣,请查看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}

请考虑从引用页面中摘录一些内容来扩展您的答案。有关为什么裸链接不被视为好的答案,请参见如何回答 - Be Brave Be Like Ukraine

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

是的,在我的情况下,括号解析已经完成了。它在cc-mode中,所以我可以在两侧使用正则表达式匹配(forward-sexp)。我只是希望能够用一个正则表达式完成它。 - Cheeso

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接