我有反应形式,其中一个控件应使用模式.*[^\s].*
进行验证。如果它用于模板驱动的表单,它运行良好。但在一个被动的情况下 - 没有。我应该修改什么来解决它?
this._form = this._formBuilder.group({
description: ['', [Validators.required, Validators.pattern('.*[^\S].*')]]
}
答案 0 :(得分:4)
查看Validator.js
:
/**
* Validator that requires a control to match a regex to its value.
*/
static pattern(pattern: string|RegExp): ValidatorFn {
if (!pattern) return Validators.nullValidator;
let regex: RegExp;
let regexStr: string;
if (typeof pattern === 'string') {
regexStr = `^${pattern}$`;
regex = new RegExp(regexStr);
} else {
regexStr = pattern.toString();
regex = pattern;
}
return (control: AbstractControl): {[key: string]: any} => {
if (isEmptyInputValue(control.value)) {
return null; // don't validate empty values to allow optional controls
}
const value: string = control.value;
return regex.test(value) ? null :
{'pattern': {'requiredPattern': regexStr, 'actualValue': value}};
};
}
重点是正则表达式模式可以像正则表达式文字一样传递,也可以传递给字符串文字。当您将其作为正则表达式文字传递时,您可以使用
/\S*\s.*/
它将被转换为"将添加pattern.toString()
和^
以及$
的字符串 - "^\\S*\\s.*$"
。这正是您可以在Validators.Pattern
中传递的字符串模式。
请注意,^\S*\s.*$
将匹配以0+非空白字符开头的字符串,然后具有1个强制性空格,然后除了换行符之外还有0 +字符。它比/^.*\s.*$/
快一点。请注意\s
= [^\S]
。