这是代码:
export const PASSWORD_PATTERN: RegExp = /^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])[a-zA-Z0-9`~!@#$%^&*()\-_+={[}\]|\\:;"'<,>.?/]{8,}$/;
此变量在其他地方的使用方式如下:
Validators.pattern(PASSWORD_PATTERN);
此代码的目的是通过确保密码包含一个小写字母、一个大写字母和一个数字来验证密码。密码可以包含任意数量的特殊字符,这些字符是可以在标准键盘上找到的字符(例如 ~ * ( } ; + )。到目前为止,正则表达式将匹配包含每个特殊字符的密码,除了加号('+')。我尝试在正则表达式中用'\+'和'\\+'替换'+',但这并没有改变结果。在某一时刻,我摆脱了每一个正则表达式中除加号之外的特殊字符,自行测试它,并在正则表达式中再次使用 '+'、'\+' 和 '\\+' 不会为包含加号的密码产生任何匹配标志。
使用我之前粘贴的正则表达式,该密码被视为匹配:
Password1`~!@#$%^&*()-_=[{]}\|;:'",<.>/?
虽然此密码不被视为匹配:
Password1`~!@#$%^&*()-_=[{]}\|;:'",<.>/?+
这两个密码之间的唯一区别是末尾的单个加号,并且无论正则表达式包含 +、\+ 还是\\+,第二个密码都不匹配。
正则表达式完全在后端工作,尽管它已针对主要在后端使用的语言进行了修改。
最佳答案
不是最漂亮的东西,但这似乎有效(或者至少朝着正确的方向前进):
let characters = /((.*[A-Z])((.*[a-z].*\d)|(.*\d.*[a-z])).*)|((.*[a-z])((.*[A-Z].*\d)|(.*\d.*[A-Z])).*)|((.*\d)((.*[a-z].*[A-Z])|(.*[A-Z].*[a-z])).*)/;
let length = /.{8,}/;
let good1 = 'abc+Def8';
let good2 = '8b2cDde+';
let bad1 = 'abc+def8';
let bad2 = 'Ab+cde';
let bad3 = 'ab+cD2'
console.log(characters.test(good1) && length.test(good1), characters.test(good2) && length.test(good2), characters.test(bad1) && length.test(bad1), characters.test(bad2) && length.test(bad2), characters.test(bad3) && length.test(bad3));
关于javascript - 正则表达式无法匹配 Angular 2 中的加号 ('+' ),但在测试人员中运行良好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44555605/