我无法完全理解在 JavaScript 中结合积极的前瞻和回溯。我阅读了这个答案以及这篇文章,并使用https://regex101.com/进行了一些测试,但并没有完全得到我期望的结果。
所以给定测试字符串香蕉12,以下工作:
(?=\d{2,})
- 断言字符串至少包含两个数字(?=[a-z]{5,})
- 断言字符串至少包含五个小写字符
这两个条件适用于banana12和12banana。
但是,当我尝试将两者结合起来时(?=\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,})
- 所以这次没有回溯数字,回溯小写字母。
所以一般来说,如果我想确保我的正则表达式正确匹配两个字符串(12banana,banana12),我需要使用:(?=\D*\d{2,})(?=[^a-z]*[a-z]{5,})
。
为什么?如果两个前瞻都单独工作,为什么它们不组合工作,为什么需要添加回溯?