Angular 2:Validators.pattern()无效

时间:2017-02-22 13:08:23

标签: angular

我正在尝试使用模式验证输入type="text"。我只想要文字。

组件:

 this.from = this.fb.group({
  name: ['',[Validators.required,Validators.pattern('/^[a-zA-Z]+$/')]],

});

Html:

<input type="text" formControlName="name"/> // omitting other html template like from tag.

上述模式验证对我不起作用。它总是返回无效状态。

8 个答案:

答案 0 :(得分:36)

将模式作为字符串传递,而不是/,它们是正则表达式的分隔符

Validators.pattern('^[a-zA-Z]+$')

答案 1 :(得分:14)

emailRegex = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/;
this.form = fb.group({
      Email : new FormControl({value: null}, Validators.compose([
        Validators.required,
        Validators.pattern(this.emailRegex)]))
});

答案 2 :(得分:12)

请记住不要这样做:

Validators.pattern("[A-Z]{1,2}[0-9][0-9A-Z]?\\s?[0-9][A-Z]{2}")

问题是你需要在s之前使用双反斜杠才能击败字符串逃逸:

{{1}}

答案 3 :(得分:8)

这是我在使用Validators.pattern()时发现的:

<强>作品

Validators.pattern('[a-z]{2}')
Validators.pattern(/^[a-z]{2}$/)

不能工作

Validators.pattern(/[a-z]{2}/i)
Validators.pattern(/[a-z]{2}/)

答案 4 :(得分:4)

我有不同模式的同样问题:

^\d{1,4}$

我正在使用它:

Validators.pattern("^\d{1,4}$") // wrong

问题是反斜杠\必须被转义,所以正确的形式是:

Validators.pattern("^\\d{1,4}$") // correct

答案 5 :(得分:1)

您可以将验证器作为字符串或正则表达式传递,如果正确执行,两者都可以工作。 让我们考虑需求仅文本

正则表达式

const regex = /[a-zA-Z]*/;
let formControl = new FormControl('', Validators.pattern(regex));

FormControl中,如果找到与正则表达式的任何匹配项(子字符串),则验证器将设置状态VALID。因此,我们需要通过^$指定输入的开头和结尾以强制完全匹配:

const regex = /^[a-zA-Z]*$/;

这将为单个单词返回VALID,满足OP的要求。但是,对于包含空格,逗号,标点和连字符的较​​长文本,它将返回INVALID。因此,如果需要,可以将其添加到字符集中:

const regex = /^[a-zA-Z,.\s-]*$/;

由于我们正在使用正则表达式,因此可以通过在末尾设置i标志来简化字符集。这告诉正则表达式忽略大小写,因此仅使用以下字符范围之一就足够了:

const regex = /^[a-z,.\s-]*$/i;

对于包含大写,小写,空格,标点和逗号的任何文本,上述正则表达式将为VALID。如果您还想接受感叹号和问号,只需将它们添加到字符集中:

const regex = /^[a-z,.!?\s-]*$/i;

为字符串

当将验证程序表达式作为字符串传递时,您不使用正则表达式定界符/ /,也不能传递正则表达式标志。因此,我们必须在集合中同时包含大写和小写字符。正如其他人指出的那样,您还必须在字符串中转义任何反斜杠。

等效的验证器作为字符串如下所示:

const validatorString = '^[a-zA-Z,.!?\\s-]*$';
let formControl = new FormControl('', Validators.pattern(validatorString));

请注意,如果在将表达式作为字符串传递时省略了^$,则Angular在处理验证程序时会自动添加它们。这就是为什么将表达式作为字符串传递通常看起来比正则表达式更好的原因。就个人而言,我更喜欢使用正则表达式而不是字符串。

为了更好地理解正则表达式的概念,我强烈建议您访问以下网站: https://regexr.com/

答案 6 :(得分:0)

Validator.pattern 中不需要字符串。您可以直接使用字符串或正则表达式。请参阅:enter image description here

答案 7 :(得分:-1)

/((?<!([A-Z]{1,10})-?)[A-Z]+-\\d+)/

强文本 这不能在JiraId的角度验证中