我有一个小正则表达式:foo(\b)?
.这是一个实验,看看我是否可以通过检查第一组是否匹配(并导致空字符串)来推断边界的存在。
我尝试了一些语言:PHP/Python/Java/C#/Rust手动输入。所有这些都符合预期:第一个匹配为空字符串,第二个匹配为null
/None
/nothing。
我不知道如何用Go和C写一个合适的代码片段,但regex 101说Go可以用它们;我对C没有信心。
然而,JS的情况并非如此,因为它在与foo food
的两场比赛中都输出了第1组的undefined
。
console.config({ maximize: true });
console.log(...'foo food'.matchAll(/foo(\b)?/g));
<script src="https://gh-canon.github.io/stack-snippet-console/console.min.js"></script>
然而,没有?
的(\b)
* 确实 * 捕获了一个空字符串。
console.config({ maximize: true });
console.log(...'foo food'.matchAll(/foo(\b)/g));
<script src="https://gh-canon.github.io/stack-snippet-console/console.min.js"></script>
考虑到?
是贪婪的,(\b)
不应该总是匹配并捕获第一个foo
之后的空字符串,就像其他语言一样吗?有什么替代方案?
我可以在NodeJS和Chrome(V8)以及Firefox(Gecko)中重现这一点,所以这可能是一个怪癖而不是一个bug。
1条答案
按热度按时间zmeyuzjn1#
正如在问题和评论中所讨论的那样,这是一个怪癖。我不知道为什么也不知道怎么做,但我找到了另一种选择:如果第一个分支匹配,则第一组将得到一个空字符串,否则什么也不做,从而有效地禁用了
?
的这种奇怪行为。试试on regex101.com。
试试看:
一个空的分支通常被认为是
?
的非推荐版本,但似乎它们毕竟有一些区别,至少在ECMAScript中是这样。