使用先行符来匹配长度超过5个字符且具有连续两个数字的字符串。
我知道解决方法应该是
/(?=\w{6,})(?=\D*\d{2})/
但是为什么第二个元素是
(?=\D*\d{2})
代替
(?=\d{2})
请帮助我理解这一点。
答案 0 :(得分:1)
先行输入必须允许输入中的任何两位数字。如果您仅使用(?=\d{2})
,则必须将2位数字放在开头。
您也可以使用(?=.*\d{2})
。关键是\d{2}
之前必须有可以与数字前的其余输入相匹配的内容。
答案 1 :(得分:1)
实际上,/(?=\w{6,})(?=\D*\d{2})/
不能确保连续2位连续的字符串中存在匹配项。
查看此演示:
var reg = /(?=\w{6,})(?=\D*\d{2})/;
console.log(reg.test("Matches are found 12."))
console.log(reg.test("Matches are not found 1 here 12."))
之所以会这样,是因为\D*
仅匹配任何非数字字符,并且一旦\w{6,}
匹配,(?=\D*\d{2})
希望在任意0+个数字之后查找两个数字,但不是字符串中的大小写。
因此, (?=\w{6,})(?=\D*\d{2})
匹配字符串中紧随其后的6个或更多单词字符以及任意0+个非数字字符后跟2位数字的位置。
验证字符串是否包含6个或更多单词chars 和在字符串中任何位置的两个连续数字的正确正则表达式是
var reg = /^(?=.*\w{6,})(?=.*\d{2})/;
或者,要支持多行字符串:
var reg = /^(?=[^]*\w{6,})(?=[^]*\d{2})/;
其中[^]
与任何字符匹配。另外,[^]
可以替换为[\s\S]
/ [\d\D]
或[\w\W]
。
和匹配长度超过5个字符且具有连续两个数字的字符串,您可以使用
var reg = /^(?=.*\d{2}).{5,}$/
var reg = /^(?=[\s\S]*\d{2})[\s\S]{5,}$/
其中
^
-字符串的开头(?=[\s\S]*\d{2})
-当前位置右侧的0+个字符后的任何地方都必须有两位数字[\s\S]{5,}
-五个或更多字符$
-字符串的结尾。