regex 的行为?在JavaScript正则表达式中应用于(\B)时的量词

o2rvlv0m  于 12个月前  发布在  Java
关注(0)|答案(1)|浏览(78)

我有一个小正则表达式: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。

zmeyuzjn

zmeyuzjn1#

正如在问题和评论中所讨论的那样,这是一个怪癖。我不知道为什么也不知道怎么做,但我找到了另一种选择:如果第一个分支匹配,则第一组将得到一个空字符串,否则什么也不做,从而有效地禁用了?的这种奇怪行为。

[...'foo food'.matchAll(/foo(?:(\b)|)/g)]

// [0: 'foo', 1: '']
// [0: 'foo', 1: undefined]

试试on regex101.com
试试看:

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>

一个空的分支通常被认为是?的非推荐版本,但似乎它们毕竟有一些区别,至少在ECMAScript中是这样。

相关问题