我现在坐在一些技术面试中,我们问一个关于检查花括号是否平衡的问题(相同的打开/关闭数量,并且关闭永远不会进行匹配打开)在一个字符串中 - 要求人们写一个小函数来验证这一点。
一些候选人考虑过尝试使用Regex来解决这个问题,然后很快就放弃了。我决定尝试一下,看看是否有可能。我目前正在使用以下测试字符串:
{(function(r){ return r; })()}
{}{}{}{}
{{{{}}}}
}{
{{}}}
{{{}}
我认为以下正则表达式可以正常运行[^{}]*({[^{}]*})*[^{}]*
。我的想法是匹配非大括号字符,然后匹配{
然后匹配非大括号字符,然后匹配}
,重复括号内的匹配,然后使用任何非大括号字符完成。
我在使用regexr.com时似乎遇到infinite
错误但我不明白为什么:
任何人都可以解释究竟是什么造成的吗?
答案 0 :(得分:2)
您收到无限错误,因为您的正则表达式可以匹配任何文本。由于您的所有群组都标有*
,因此它们都被视为可选(*
匹配零次或多次)。这意味着引擎可以在模式中找到零个出现的任何组,并仍然认为文本匹配。
考虑使用+
标记至少一个组,这意味着“一个或多个”而不是“零或更多”。试试这个模式:
[^{}]*(\{[^{}]*\})+[^{}]*
通过这种方式,引擎有一些限制,必须匹配您的模式才能被接受。
注意:当不在字符块({
)中时,转义}
和[]
也是明智之举。我在上面的模式中做到了这一点。 Regexr.com似乎并不关心,但有些引擎可能会在没有它们的情况下产生解析错误。
答案 1 :(得分:0)
<强> 更新 强>
这是你需要的正则表达式(一级):
\{{0,1}[^\{\}]*\{[^\{\}]*\}[^\{\}]*\}{0,1}
我无法编写嵌套规则,但您可以说您需要多少级别。
说明:
| - 表示替代(a | b - 字面匹配“a”或“b”)
^ - 表示行的开头(^ a - 匹配任何以“a”字面开头的字符串,“出租车”,“苹果”......)
$ - 表示行尾($ - 匹配任何以“a”字面结尾的字符串,“伞”)
\ { - 匹配字符:“{”字面意思为
\( - 匹配字符:“(”字面意思