积极向前

时间:2019-07-01 20:15:53

标签: javascript regex

使用先行符来匹配长度超过5个字符且具有连续两个数字的字符串。

我知道解决方法应该是

/(?=\w{6,})(?=\D*\d{2})/

但是为什么第二个元素是

(?=\D*\d{2})

代替

(?=\d{2})

请帮助我理解这一点。

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,}-五个或更多字符
  • $-字符串的结尾。