【问题标题】:Regular Expressions: Positive and Negative Lookahead (JS) [duplicate]正则表达式:正负前瞻(JS)[重复]
【发布时间】:2018-10-17 04:02:55
【问题描述】:

我在 Free Code Camp 上被困在这个问题上。看了讨论室的各种解释,问了朋友,还是不明白。

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

答案:

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

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

【问题讨论】:

  • having to write \D* to find two consecutive digits 找到任何非数字。 \d{2} 只会匹配数字。但是数字前面可以有非数字的符号。
  • 这个答案是错误的。应该是/^(?=[\s\S]{6})(?=[\s\S]*\d{2})/

标签: javascript regex lookahead


【解决方案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},而不是\w{5}。 (不需要\w{6,},匹配前6个就够了)

要解决此问题,请在第二次前瞻中重复任何字符,后跟两位数字,因为您不知道哪些字符可能出现在两位数子字符串之前。此外,如果字符串开头的位置不匹配,最好让正则表达式 立即 失败(因为如果位置 0 不匹配,那么假设字符串也不会匹配其他位置由单词字符组成)。所以,使用^ 来表示字符串的开始锚点:

const re = /^(?=\w{6,})(?=.*\d{2})/;
console.log(re.test('23foob'));
console.log(re.test('foob23'));
console.log(re.test('aa1b23'));

【讨论】:

    猜你喜欢
    • 2011-10-14
    • 2010-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多