【问题标题】:RegExp special characters escapeRegExp 特殊字符转义
【发布时间】:2019-01-29 09:25:01
【问题描述】:

我已经在正则表达式中搞砸了几个小时的特殊字符,并且必须承认我放弃了。

尝试做一个密码测试函数,测试至少以下之一:小写、大写、整数和特殊字符。

特殊字符为“¤@+-£$!%*#?&().:;,_”。

我用这个函数来转义它们:

//used to escape special characters [¤@+-£$!%*#?&().:;,_]
RegExp.escape = function(str) {
  return String(str).replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1");
};

并在这两个测试中测试了正则表达式:

var pattern1=/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[¤@\+-£\$\!%\*#\?&\(\)\.\:;,_]).{8,}$/g;
var regexVal1=pattern1.test(password);  

var pattern2=new RegExp("^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[¤@\+-£\$\!%\*#\?&\(\)\.\:;,_]).{8,}$","g");
var regexVal2=pattern2.test(password);

结果是:

var password="AaBbCcDd";//both regexVal1 and regexVal2 is false
var password="AaBbCcDd90";//both regexVal1 and regexVal2 is true
var password="AaBbCcDd90#¤";//both regexVal1 and regexVal2 is true

var password="AaBbCcDd90"; 的结果应该是“假”!

问题是:我做错了什么??

【问题讨论】:

标签: javascript regex


【解决方案1】:

原因是- 在字符类中有特殊含义。所以\+-£里面的意思是“Unicode代码表中从'+'到'£'的所有字符”。

所以你需要在那里转义'-'。

是的,你不需要在那里转义所有其他字符

/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[¤@+\-£$!%*#?&().:;,_]).{8,}$/g

应该适合你

【讨论】:

  • 非常感谢。做到了。当然,我只需要逃避——但我必须承认,我对这个问题视而不见,当我处理正则表达式时,这种情况经常发生。顺便说一句,当使用“new RegExp()”时,它应该是双重转义的。
  • 您可以通过将- 放在字符类的开头来避免转义它:[-¤@+£$!%*#?&().:;,_]
  • ...或者最后。但仍有可能有人“在允许的列表中再添加一个字符”并再次破坏一切:(
【解决方案2】:

在“+”和“-”之前添加“\”就够了;

 var Regex1 =^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[¤@\+\-\£\$\!%\*#\?&\(\)\.\:;,_]).{8,}$

测试你的正则表达式的简单方法是使用这个网站:https://regex101.com/


这个例子也不错:

在 JavaScript 中使用 RegEx 测试密码强度

var mediumRegex = new RegExp("^(((?=.*[a-z])(?=.*[A-Z]))|((?=.*[a-z])(?=.*[0-9]))|((?=.*[A-Z])(?=.*[0-9])))(?=.{6,})");

https://www.thepolyglotdeveloper.com/2015/05/use-regex-to-test-password-strength-in-javascript/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-02
    • 2014-11-10
    • 1970-01-01
    • 2016-05-01
    • 2018-07-16
    相关资源
    最近更新 更多