为什么\ W元字符在这个Javascript正则表达式中无法正常工作

时间:2015-06-03 21:33:08

标签: javascript regex

你好,我无法理解这个正则表达式。

'^.*(?=.{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

我真的希望得到一个解释,因为这对我来说似乎很奇怪。 提前致谢

3 个答案:

答案 0 :(得分:1)

当我从正则表达式中删除'时,它运行正常。

^.*(?=.{8,})(?=.*[a-z])(?=.*[A-Z])(?=.*[\d\W]).*$

答案 1 :(得分:1)

这是因为你的语法不适合正则表达式。在JS中,regex应该被包装为/.../,其中/被称为正则表达式分隔符。

此外,您的正则表达式可以重构为效率:

/^(?=.*?[a-z])(?=.*?[A-Z])(?=.*?[\d\W]).{8,}$/

Updated JSFiddle

答案 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]).*$/);