javascript - 正则表达式 - 无限错误是什么意思?

标签 javascript c# regex

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

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

通过

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

失败

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

我认为以下正则表达式可以工作 [^{}]*({[^{}]*})*[^{}]*。想法是匹配非花括号字符,然后匹配 {,然后是非花括号字符,然后是 },重复括号匹配,然后以任何非大括号字符。

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

enter image description here

谁能解释一下到底是什么原因造成的?

最佳答案

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

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

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

这样,引擎有某种限制,它必须匹配您的模式才能被接受。

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

关于javascript - 正则表达式 - 无限错误是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35958985/

相关文章:

c# - 如何在 ASP.NET Web 窗体中显示变量值?

regex - BASH 中的正则表达式?

javascript - 变量定义中的百分号

javascript - 无法从innerHTML获取动态数据 - Angular

javascript - 通过 AJAX 设置 fusioncharts 数据集

c# - WebAPI 返回文件和下载未开始

javascript - 重定向到 iTunes 链接时如何避免 Safari 警报

c# - 用于嵌套层次结构的响应式(Reactive)扩展展开/扫描方法

javascript - 使用未知长度字符串拆分 JavaScript 字符串,例如\n

javascript - 正则表达式否定性环顾四周,相邻2个匹配项