0

我无法完全理解在 JavaScript 中结合积极的前瞻和回溯。我阅读了这个答案以及这篇文章,并使用https://regex101.com/进行了一些测试,但并没有完全得到我期望的结果。

所以给定测试字符串香蕉12,以下工作:

  • (?=\d{2,})- 断言字符串至少包含两个数字
  • (?=[a-z]{5,})- 断言字符串至少包含五个小写字符

这两个条件适用于banana1212banana

但是,当我尝试将两者结合起来时(?=\d{2,})(?=[a-z]{5,}),我没有得到匹配。为了在使用banana12时获得匹配,我需要添加\D*到 digit-testing lookahead: (?=\D*\d{2,})(?=[a-z]{5,})

为什么不起作用(?=\d{2,})(?=[a-z]{5,})

如果我将测试字符串更改为12banan,要获得匹配,我需要使用:(?=\d{2,})(?=[^a-z]*[a-z]{5,})- 所以这次没有回溯数字,回溯小写字母。

所以一般来说,如果我想确保我的正则表达式正确匹配两个字符串(12bananabanana12),我需要使用:(?=\D*\d{2,})(?=[^a-z]*[a-z]{5,})

为什么?如果两个前瞻都单独工作,为什么它们不组合工作,为什么需要添加回溯?

4

0 回答 0