Javascript 正则表达式断言

Javascript RegEx assertion

我有这个例子:

/(?=\d)(?=[a-z])/.test("3a") 其中 returns false 但是这个 /(?=\d)(?=.*[a-z])/.test("3a") 有效。

你能解释一下吗?

你的第一个模式

/(?=\d)(?=[a-z])/.test("3a")

断言 数字和字母出现在 同一个地方 。显然,这永远不会是真的。另一方面,您的第二个模式:

/(?=\d)(?=.*[a-z])/.test("3a")

断言一个数字出现,并且它还断言一个字母出现在字符串中的任何位置。这匹配 3a.

的输入

让我分解一下你在做什么:

Test string = test("3a")

示例 1:/(?=\d)(?=[a-z])/

(?=\d) 是下一个字符是数字的正向预测
(?=[a-z]) 是下一个字符在 a-z

范围内的正向预测

这是不可能的,并且总是 return 错误,因为它断言下一个字符既是 a-z 又是数字,但它不可能是。

示例 2:/(?=\d)(?=.*[a-z])/

(?=\d) 是下一个字符是数字的正向预测
(?=.*[a-z]) 是一个积极的前瞻,在匹配开始后的字符串中的任何地方都有一个字符在 a-z

范围内

这会在测试字符串中看到 3a,因为从 3 开始匹配,下一个字符是数字,而 3a 满足 .*[a-z] 断言。

指出这一点可能重要也可能不重要,因为这些是前瞻性的,您实际上并没有匹配任何东西。我不知道你到底想做什么。

如果你想测试一个数字后面是否有 a-z 你可以把它放在一个断言中:
/(?=\d[a-z])/