【发布时间】:2016-03-12 14:38:33
【问题描述】:
我目前正在参加一些技术面试,我们问了一个关于检查大括号是否平衡的问题(相同数量的打开/关闭,并且关闭永远不会进行匹配的打开) - 要求人们编写一个小函数来验证这一点。
一些候选人曾考虑尝试使用正则表达式来解决这个问题,但很快就放弃了。我决定试一试,看看是否可行。我目前正在使用以下测试字符串:
通过
{(function(r){ return r; })()}
{}{}{}{}
{{{{}}}}
失败
}{
{{}}}
{{{}}
我认为以下正则表达式可以工作[^{}]*({[^{}]*})*[^{}]*。想法是匹配非大括号字符,然后匹配 {,然后是非大括号字符,然后是 },重复括号匹配,然后以任何非大括号字符结束。
我在使用 regexr.com 时似乎收到了 infinite 错误,但我不明白为什么:
谁能解释一下到底是什么原因造成的?
【问题讨论】:
-
在大多数正则表达式风格中,
{和}需要转义(在字符类之外),因为它们是量词。 -
我不认为 JavaScript 可以支持任意级别的嵌套。一些正则表达式风格可以(因为它们超越了标准正则表达式),但不是 JavaScript 的。你可以做一个可以处理(比如说)最多四层嵌套的表达式,但它必须是硬编码的。
-
"Finite automata can't count" - 它可能可以将平衡大括号与一些现代“正则表达式”机制相匹配,但如果它我会很惊讶JavaScript 是可能的。
-
@Pointy 使用 Javascript 他可以我们 String.replace(),搜索
{和}并在作为replace的第二个参数传递的函数中计算它们 -
现代正则表达式引擎支持堆栈进行计数。在这种情况下,它将用于平衡文本。一些引擎使用递归 Perl、PCRE 等来做到这一点,一些引擎通过计数 Dot-Net 来做到这一点。大多数其他旧的、过时的引擎 Java、JavaScript 等都不会这样做。底线,平衡的文本(任何东西)可以使用现代引擎进行测试或匹配。 你的尝试肯定做不到。
标签: javascript c# regex