让我们在 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/