正则表达式:正向和负向超前(JS)

时间:2018-10-17 04:02:56

标签: javascript regex lookahead

我在Free Code Camp上遇到了这个问题。我已经在讨论室中查看了各种解释,并问了我的朋友,但我还是不明白。

挑战:在pwRegex中使用先行符来匹配长度超过5个字符且具有连续两位数字的密码。

答案:

 let sampleWord = "astronaut";
 let pwRegex = /(?=\w{5,})(?=\D*\d{2})/;
 let result = pwRegex.test(sampleWord);

我不明白必须写\ D *才能找到两个连续数字的原因。为什么d {2}不够用?

1 个答案:

答案 0 :(得分:1)

答案是错误的,实际上-如果有单个数字,然后是非数字(或某种组合),然后是2个数字,则正则表达式将失败。例如:

const sampleWord = "a1b23";
const pwRegex = /(?=\w{5,})(?=\D*\d{2})/;
console.log(pwRegex.test(sampleWord));

这是因为\D仅与非数字字符匹配 -它与数字不匹配,因此不会与初始a2b正确匹配。

要回答您的问题,只需\d{2}而不是在前面重复字符,这将要求两位数字位于字符串的开头(或其他错误的地方):

const re = /(?=\w{5,})(?=\d{2})/;
console.log(re.test('23foo'));
console.log(re.test('foo23'));

另一个问题(可能只是拼写错误或摘要复印不正确)是“长度超过5个字符”表示“至少6个字符”,因此您需要\w{6}而不是{{ 1}}。 (不需要\w{5},只需匹配前6个就足够了)

要解决此问题,请在第二次查找中,重复任何字符后跟两位数字,因为您不知道在两位数的子字符串之前可能会出现哪些字符。另外,如果字符串开头的位置不匹配,最好让正则表达式立即失败(因为假设位置0不匹配,则假定该字符串也没有其他位置匹配)由文字字符组成)。因此,使用\w{6,}来指示字符串开始锚点:

^