FCC Beta练习正则疑问:/(?=\w{5,})(?=\D*\d)/为何表示连续数字?
关于正则表达式
/(?=\w{5,})(?=\D*\d)/ 的澄清 首先得明确:你提到的这个正则本身并不表示“匹配两个连续数字”,它的作用其实是验证字符串满足两个特定条件,咱们一步步拆解来看:
拆解每个正向预查的作用
这个正则是两个正向先行断言的组合,断言的特点是只检查条件是否成立,不会“消耗”任何匹配字符,所以两个断言是同时对同一个位置生效的:
(?=\w{5,}):要求从当前位置开始,后面至少有5个\w字符(\w等价于字母、数字、下划线,也就是[A-Za-z0-9_]),简单说就是字符串长度至少为5,且全由单词字符组成。(?=\D*\d):要求从当前位置开始,后面可以有0个或多个非数字字符(\D就是非数字),然后必须跟着至少一个数字——这部分只要求字符串里至少有一个数字,和“连续两个数字”完全不沾边。
为什么你会觉得它匹配两个连续数字?
大概率是你混淆了这个正则和另一个类似的规则。如果要验证字符串满足“长度≥5的单词字符,且包含至少两个数字(不管是否连续)”,正则应该写成 /(?=\w{5,})(?=\D*\d\D*\d)/;如果是要必须包含两个连续数字,那正则得改成 /(?=\w{5,})(?=.*\d{2})/(\d{2}就是连续两个数字,.*匹配任意字符)。
举个例子,字符串abc12会被你给出的原正则匹配(满足长度5+有一个数字),但abc1x2也会被匹配——但它并没有连续数字,这也能说明原正则和“连续两个数字”无关。
内容的提问来源于stack exchange,提问作者ajhernandez95
相关产品推荐
相关产品推荐

