你好,我无法理解这个正则表达式。
'^.*(?=.{8,})(?=.*[a-z])(?=.*[A-Z])(?=.*[\d\W]).*$'
它应该匹配 ZXC!“#zxc123 ,它在一个在线JS正则表达式测试程序中,但是当我在我正在处理的应用程序中尝试它时,它不匹配。它似乎需要字母 W ,我假设它来自非单词选择器\ W。
所以情况是,它适用于在线测试人员,但不适用于实际的JS。
我在Fiddle上设置了一个例子,所以你可以亲自看看。
$(document).ready(function(){
var inputField = $('#regex');
inputField.on('input', function(e){
var inputValue = $(e.currentTarget).val();
MatchString(inputValue);
});
function MatchString(str){
var matches = str.match('^.*(?=.{8,})(?=.*[a-z])(?=.*[A-Z])(?=.*[\d\W]).*$');
if(matches){
$('#output').text('Matches')
}
else{
$('#output').text('Not matching')
}
}
MatchString(inputField.val());
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" id="regex" value='ZXC!"#zxc!"#'/>
<p id="output"></p>
我测试了正则表达式on regex101
我真的希望得到一个解释,因为这对我来说似乎很奇怪。 提前致谢
答案 0 :(得分:1)
当我从正则表达式中删除'时,它运行正常。
^.*(?=.{8,})(?=.*[a-z])(?=.*[A-Z])(?=.*[\d\W]).*$
答案 1 :(得分:1)
这是因为你的语法不适合正则表达式。在JS中,regex应该被包装为/.../
,其中/
被称为正则表达式分隔符。
此外,您的正则表达式可以重构为效率:
/^(?=.*?[a-z])(?=.*?[A-Z])(?=.*?[\d\W]).{8,}$/
答案 2 :(得分:1)
请注意,由于字符串的反斜杠替换规则,内部字符串"\d"
将转义为"d"
,"\W"
将转义为"W"
(请参阅string literal documentation on MDN })。
因此,如果您需要反斜杠字符,则需要将其转义:
str.match('^.*(?=.{8,})(?=.*[a-z])(?=.*[A-Z])(?=.*[\\d\\W]).*$');
或者你可以使用正则表达式文字:
str.match(/^.*(?=.{8,})(?=.*[a-z])(?=.*[A-Z])(?=.*[\d\W]).*$/);