【问题标题】:Pattern sometimes matched and sometimes not模式有时匹配有时不匹配
【发布时间】:2018-09-14 10:37:51
【问题描述】:

我在 .ts 文件中使用以下代码在 Angular 5 中实现了一个模式,用于密码验证。假设这样做 - 支持最少八个字符、至少一个大写字母、一个小写字母、一个数字和一个特殊字符。见:Regex for password must contain at least eight characters, at least one number and both lower and uppercase letters and special characters

wcodePattern = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[$@$!%*?&])[A-Za-z0-9\d$@$-_!%*?&]{8,20}"; 

我明白了,当我在密码文本框中输入一个字符串时,例如Niladri1! 它可以工作,但是,当我输入像 Nopasss123!! 这样的字符串时,它会显示 User name not valid.

下面是angular 5 html的代码:

<div *ngIf="wcode.errors?.pattern">User name not valid.</div> 

我还测试了以下内容,它将字符串作为Noladris 假定为无效。

^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@-_!])[A-Za-z0-9\d@-_!]{8,20}$

我错过了什么?

【问题讨论】:

  • 你从stackoverflow.com/a/21456918/3832970那里得到解决方案了吗?我刚刚修复了那里的一些问题。在末尾添加$ 并在字符类中删除一个$。另外,将- 放在结束] 之前。 ^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[@$!%*?&amp;])[A-Za-z0-9@$_!%*?&amp;-]{8,20}$ 应该可以工作,请参阅 demo
  • @WiktorStribiżew 我已经按照你的建议添加了我所采取的措施。请再次检查问题并告诉我。
  • 当然,那是因为你没有转义连字符,[@-_]+ 匹配所有 ASCII 字母等等。

标签: angular pattern-matching


【解决方案1】:

你需要使用

wcodePattern = '^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[@$!%*?&])[A-Za-z0-9@$_!%*?&-]{8,20}$'

或者,因为您在 RegExp 构造函数中使用它,所以这里有一个版本:

wcodePattern = '^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[@$!%*?&])[A-Za-z\\d@$_!%*?&-]{8,20}$'

注意:

  • 您必须将- 放在字符类的开头/结尾以匹配文字连字符,或者在里面转义
  • 字符串文字中的反斜杠必须加倍,否则它们会定义转义序列,例如 \n\t 等。
  • $ 必须添加到模式的末尾以“锚定”匹配(即匹配字符串的末尾以确保最大字符限制)。
  • [$@$] = [$@] - 无需在字符类中重复字符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-12
    • 1970-01-01
    相关资源
    最近更新 更多