JS - 正向先行断言和行尾

6
为什么第一个测试失败了?
/^[ab](?=[cd])$/.test('ac') // => false

/^[ab](?=[cd])/.test('ac')  // => true

只有字符串 'ac'、'ad'、'bc' 和 'bd' 才能通过。

没有其他类似于 'ac bd' 或 'acbd' 的字符串。

然而,在第一个正则表达式中使用 $ 并不能起到帮助作用,而第二个正则表达式也会通过像 'acbd' 这样的字符串。

3个回答

5
你需要了解前瞻是如何工作的。
正向前瞻 (?=[cd])$ 检查接下来的字符是否与跟在前瞻后面的模式匹配(在这种情况下,是字符串末尾)。字符串末尾既不是 c 也不是 d。因此,没有匹配项。
你需要将 $ 放到前瞻中,以使其匹配 a
^[ab](?=[cd]$)

查看 在Regex101.com上的演示

Regular expression visualization

Debuggex演示


谢谢您提供的链接。 - Ankur
1
很高兴能够帮助。当你有一点空闲时间时,你也可以阅读正则表达式中的前后查找 - Wiktor Stribiżew

1
这个正则表达式应该通过:
/^[ab](?=[cd]$)/.test('ac') 

为什么的原因

/^[ab](?=[cd])$/.test('ac') 

代码出错是因为在ab后面没有$(输入结束符),而是在a后面有一个字母c


这里有重复答案的情况 :) - anubhava

0
/^[ab](?=[cd])$/.test('ac') // => false

这个失败了,因为你没有捕获 cLookahead0 宽度断言,它们不会捕获任何内容,只是断言。你的字符串匹配失败了,因为你启用了 anchors,所以整个字符串应该匹配。在第二种情况下,它通过了,因为它得到了部分匹配,因为没有 $

你需要的是

^[ab][cd]$

感谢您指出(?=)不是捕获组。 - Ankur

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接