我需要匹配包含完全 2个大写字母和3个数字的单词。数字和大写字母可以位于单词中的任何位置。
HelLo1aa2s3d:true
WindowA1k2j3:true
AAAsjs21js1:false
ASaaak12:false
我的正则表达式尝试,但只匹配2个大写字母:
([a-z]*[A-Z]{1}[a-z]*){2}
答案 0 :(得分:2)
您可以使用正则表达式 lookaheads :
/^(?=(?:.*[A-Z].*){2})(?!(?:.*[A-Z].*){3,})(?=(?:.*\d.*){3})(?!(?:.*\d.*){4,}).*$/gm
说明:
^ // assert position at beginning of line
(?=(?:.*[A-Z].*){2}) // positive lookahead to match exactly 2 uppercase letters
(?!(?:.*[A-Z].*){3,}) // negative lookahead to not match if 3 or more uppercase letters
(?=(?:.*\d.*){3}) // positive lookahead to match exactly 3 digits
(?!(?:.*\d.*){4,}) // negative lookahead to not match if 4 or more digits
.* // select all of non-newline characters if match
$ // end of line
/gm // flags: "g" - global; "m" - multiline
<强> Regex101 强>
答案 1 :(得分:1)
使用String.match
函数的解决方案:
function checkWord(word) {
var numbers = word.match(/\d/g), letters = word.match(/[A-Z]/g);
return (numbers.length === 3 && letters.length === 2) || false;
}
console.log(checkWord("HelLo1aa2s3d")); // true
console.log(checkWord("WindowA1k2j3")); // true
console.log(checkWord("AAAsjs21js1")); // false
console.log(checkWord("ASaaak12")); // false
答案 2 :(得分:1)
我想,你只需要一个前瞻。
^(?=(?:\D*\d){3}\D*$)(?:[^A-Z]*[A-Z]){2}[^A-Z]*$
\d
是数字的short。 \D
是\d
的否定,匹配非数字(?=
打开正面lookahead。 (?:
会打开non capturing group。^
开始(?=(?:\D*\d){3}\D*$)
向前看正好三位数,直到$
end。(?:[^A-Z]*[A-Z]){2}[^A-Z]*
匹配一个字符串,其中只有两个高位字母,直到$
结束。 [^
会打开negated character class。如果您只想允许使用字母数字字符,请将[^A-Z]
替换为[a-z\d]
like in this demo。
答案 3 :(得分:0)