我现在正在参加一些技术面试,我们问了一个关于检查大括号在一个字符串中是否平衡(相同数量的打开/关闭并且关闭永远不会进行匹配打开)的问题 - 要求人们编写一个小函数来验证这一点。
一些候选人考虑过尝试使用 Regex 来解决这个问题,但很快就放弃了。我决定尝试一下,看看是否可行。我目前正在使用以下测试字符串:
通过
{(function(r){ return r; })()}
{}{}{}{}
{{{{}}}}
失败
}{
{{}}}
{{{}}
我认为以下正则表达式可以工作 [^{}]*({[^{}]*})*[^{}]*
。想法是匹配非花括号字符,然后匹配 {
,然后是非花括号字符,然后是 }
,重复括号匹配,然后以任何非大括号字符。
虽然我在使用 regexr.com 时似乎遇到了 infinite
错误,但我不明白为什么:
谁能解释一下到底是什么原因造成的?
最佳答案
您收到无限错误,因为您的正则表达式可以匹配任何文本。由于您的所有组都标有 *
,因此它们都被视为可选(*
匹配零次或多次出现)。这意味着引擎可以在您的模式中找到零次出现的任何组,并且仍然认为该文本是匹配的。
考虑用 +
标记至少一个组,这意味着“一个或多个”而不是“零个或多个”。试试这个模式:
[^{}]*(\{[^{}]*\})+[^{}]*
这样,引擎有某种限制,它必须匹配您的模式才能被接受。
注意:当不在字符 block ([]
) 中时,转义 {
和 }
也是明智的。我已经在上面的模式中完成了这个。 Regexr.com 似乎并不关心,但有些引擎可能会在没有它们的情况下产生解析错误。
关于javascript - 正则表达式 - 无限错误是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35958985/