2015-06-03 77 views
2

你好,我无法理解这个正则表达式。为什么在这个Javascript正则表达式中W元字符无法正常工作

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

应该匹配ZXC!“#zxc123,它确实在网上JS正则表达式测试仪,但是当我在我工作的应用尝试,它不会匹配,这似乎需要信W¯¯,我假设来自于非单词选择\ W。

所以的情况下,它可以工作在一个在线测试仪,但与实际的JS。

我给自己定在小提琴上举一个例子,所以你可以看看自己。

$(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

注意'不包括_'在'( ?=。* [\ d \ W])'检查。你和你一起吗?如果你想说一个字符不是小写字母/大写字母a-z,那么直接写下''[^ a-zA-Z]' – nhahtdh

+0

我还没有意识到这一点。谢谢 – Deetlev

回答

1

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

而且您正则表达式可重构的效率,因为这样的:

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

Updated JSFiddle

+0

String.match通过将字符串传递给'new RegExp()'来自动将字符串转换为正则表达式。所以这不是原因。请参阅:https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/String/match – slebetman

+0

这是因为'\ w'变成'w',除非包含在'/'中或者使用double逃跑。 – anubhava

+1

伟大的工程!我将它改为正则表达式而不是字符串。 Javascript将文本视为正则表达式,一旦我添加了正则表达式分隔符。我完全忘记了分隔符,所以谢谢! – Deetlev

1

当我从您的正则表达式中删除,它工作正常。

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

注意这里面的字符串"\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]).*$/);