JavaScript 正则表达式意外行为

标签 javascript regex

让我们在 JavaScript 中使用以下(有点复杂)正则表达式:

\{\{\s*(?:(?:\:)([\w\$]+))?\#(?:([\w\$\/]+@?)?([\s\S]*?))?(\.([\w\$\/]*))?\s*\}\}

我想知道为什么它在这里匹配整个字符串:

{{:control#}}x{{*>*}}

但不是在下面的情况下(在#之后添加一个空格):

{{:control# }}x{{*>*}}

在 PHP 或 Python 中,它在两种情况下都只匹配第一部分 {{: ... }}

我希望 JavaScript 也只匹配第一部分。在 [\s\S] 之前不破解 (?!}}) 是否可能?

此外,性能是 JavaScript 中这种不同行为的原因,还是仅仅是规范中的错误?

最佳答案

您可以使用惰性 ?? 量词在 JavaScript 中实现相同的行为:

\{\{\s*(?:(?::)([\w$]+))?#(?:([\w$\/]+@?)?([\s\S]*?))??(\.([\w$\/]*))?\s*}}
                                                     ^^  

参见 demo

来自 rexegg.com :

A??     Zero or one A, zero if that still allows the overall pattern to match (lazy)

这不是错误,并且符合 JavaScript 遵守的 ECMA 标准规范。

这里,在 (?:([\w$\/]+@?)?([\s\S]*?))? 中,我们有一个可选的非捕获组可以匹配空文本。 JavaScript 正则表达式引擎“使用”可选组中的空文本,以便以后可以通过反向引用访问它们。此问题与 Backreferences to Failed Groups 密切相关.例如。 ((q)?b\2) 将匹配 JavaScript 中的 b,但它不会匹配 Python 和 PCRE。

According to the official ECMA standard, a backreference to a non-participating capturing group must successfully match nothing just like a backreference to a participating group that captured nothing does.

关于JavaScript 正则表达式意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31187970/

相关文章:

php - 总是返回字母数字字符?

javascript - click 函数不引用 servlet (IDEA, java)

javascript - 从数组中生成一个随机单词,然后将其打印到控制台日志中的 javascript 函数中

javascript - 正则表达式在javascript中查找特定字符串

Javascript 测试方法不起作用(如预期的那样)

javascript - 如何对大数字使用格式设置

Angular:Formbuilder 中的验证器字母数字或空格

javascript - 将多个代码块合并在一起

使用 JQ 工具的正则表达式

javascript - javascript中的匹配和替换子字符串问题