正则表达式 - 无限错误意味着什么?

时间:2016-03-12 14:38:33

标签: javascript c# regex

我现在坐在一些技术面试中,我们问一个关于检查花括号是否平衡的问题(相同的打开/关闭数量,并且关闭永远不会进行匹配打开)在一个字符串中 - 要求人们写一个小函数来验证这一点。

一些候选人考虑过尝试使用Regex来解决这个问题,然后很快就放弃了。我决定尝试一下,看看是否有可能。我目前正在使用以下测试字符串:

{(function(r){ return r; })()} {}{}{}{} {{{{}}}}

故障

}{ {{}}} {{{}}

我认为以下正则表达式可以正常运行[^{}]*({[^{}]*})*[^{}]*。我的想法是匹配非大括号字符,然后匹配{然后匹配非大括号字符,然后匹配},重复括号内的匹配,然后使用任何非大括号字符完成。

我在使用regexr.com时似乎遇到infinite错误但我不明白为什么:

enter image description here

任何人都可以解释究竟是什么造成的吗?

2 个答案:

答案 0 :(得分:2)

您收到无限错误,因为您的正则表达式可以匹配任何文本。由于您的所有群组都标有*,因此它们都被视为可选(*匹配零次或多次)。这意味着引擎可以在模式中找到零个出现的任何组,并仍然认为文本匹配。

考虑使用+标记至少一个组,这意味着“一个或多个”而不是“零或更多”。试试这个模式:

[^{}]*(\{[^{}]*\})+[^{}]*

通过这种方式,引擎有一些限制,必须匹配您的模式才能被接受。

注意:当不在字符块({)中时,转义}[]也是明智之举。我在上面的模式中做到了这一点。 Regexr.com似乎并不关心,但有些引擎可能会在没有它们的情况下产生解析错误。

答案 1 :(得分:0)

<强> 更新

这是你需要的正则表达式(一级):

\{{0,1}[^\{\}]*\{[^\{\}]*\}[^\{\}]*\}{0,1}

我无法编写嵌套规则,但您可以说您需要多少级别。

说明:

| - 表示替代(a | b - 字面匹配“a”或“b”)
^ - 表示行的开头(^ a - 匹配任何以“a”字面开头的字符串,“出租车”,“苹果”......) $ - 表示行尾($ - 匹配任何以“a”字面结尾的字符串,“伞”) \ { - 匹配字符:“{”字面意思为 \( - 匹配字符:“(”字面意思