【发布时间】:2014-05-24 22:23:27
【问题描述】:
首先,让我解释一下,这个问题既不是关于如何捕获组,也不是关于如何使用量词,这是我非常熟悉的正则表达式的两个特性。对于可能熟悉奇异引擎中不寻常语法的正则表达式爱好者来说,这更像是一个高级问题。
捕获量词
有谁知道正则表达式是否允许您捕获量词?我的意思是,与 + 和 * 等量词匹配的字符数将被计算在内,并且这个数字可以在另一个量词中再次使用。
例如,假设您想确保在这种字符串中具有相同数量的 Ls 和 Rs:LLLRRRRR
你可以想象这样的语法
L(+)R{\q1}
其中 L 的 + 量词被捕获,而捕获的数字在 R 的量词中被称为 {\q1}
这对于平衡字符串中 {@,=,-,/} 的数量很有用,例如 @@@@“星球大战”====“1977”----“科幻小说”////“乔治卢卡斯”
与递归的关系
在某些情况下,量词捕获可以优雅地代替递归,例如由相同数量的 Ls 和 Rs 框起来的一段文本,a in
L(+) some_content R{\q1}
这个想法在以下页面上详细介绍了:Captured Quantifiers
它还讨论了对捕获的量词的自然扩展:量词算法,适用于您想要匹配 (3*x + 1) 之前匹配的字符数的情况。
我正在尝试找出是否存在类似的东西。
提前感谢您的见解!!!
更新
Casimir 给出了一个绝妙的答案,展示了两种方法来验证模式的各个部分是否具有相同的长度。但是,我不想在日常工作中依赖其中任何一个。这些确实是展示出色表演技巧的技巧。在我看来,这些漂亮但复杂的方法证实了问题的前提:捕获量词(例如 + 或 *)能够匹配的字符数量的正则表达式功能将使这种平衡模式非常简单,并将语法扩展为一种令人愉悦的表达方式。
更新 2(很久以后)
我发现 .NET 有一个与我所询问的功能相近的功能。添加了一个答案来演示该功能。
【问题讨论】:
-
我不知道有任何正则表达式引擎允许您获取量词的计数。通常,您不能使用正则表达式进行算术运算。一些正则表达式引擎支持递归,您可以使用它来匹配平衡表达式。见regular-expressions.info/refrecurse.html
-
我认为最好的办法是将其捕获为一个组并计算您选择的语言中的字符。
标签: regex recursion quantifiers