猿问

这个正则表达式是什么:/^\D(?=\w{5})(?=\d{2})/ 不匹配“bana12”?

目标是匹配长度大于 5 个字符、不以数字开头且有两个连续数字的字符串。我认为我的正则表达式足以做到这一点,但不匹配“bana12”。

这个正则表达式完成了这项工作:

var pwRegex =  /^\D(?=\w{5})(?=\w*\d{2})/;

这个正则表达式不是比我的更严格吗?为什么我必须指定两个或多个数字前面有零个或多个字符?


心有法竹
浏览 176回答 2
2回答

慕斯709654

它比你的限制少。在 之后\D,有 2 个前瞻。对于您的正则表达式,它们是(?=\w{5})(?=\d{2})这意味着非数字后面的东西必须同时满足它们。那是,非数字后必须有 5 个单词字符,并且非数字后必须有 2 位数字。ana12紧跟在字符串中的非数字之后。an不是 2 位数字,因此您的正则表达式不匹配。然而,工作正则表达式有这两个先行:(?=\w{5})(?=\w*\d{2})它断言紧接在 之后必须有这两件事\D:5个单词字符,和一堆单词字符,后跟两位数字ana12符合这两种描述。试试这个Regex101 演示。查看正则表达式调试器中的第 6 步。那是它试图匹配第二个前瞻的时候

LEATH

您走在正确的轨道上,也许可以使用前瞻,并且模式的开始也正确,但是它缺少一些东西。考虑这个版本:^\D(?=.*\d{2})\w{4,}$下面是对模式的解释:^                from the start of the string    \D           match any non digit character    (?=.*\d{2})  then lookahead and assert that two consecutive digits occur    \w{4,}       finally match four or more word characters (total of 5 or more characters)$                end of the string您当前尝试中缺少的主要部分是它在开头仅匹配一个非数字字符。您需要提供一个可以匹配 5 个或更多字符的模式。
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答