Validations.pattern不适用于Regex

时间:2017-06-27 12:06:03

标签: regex angular typescript

我有反应形式,其中一个控件应使用模式.*[^\s].*进行验证。如果它用于模板驱动的表单,它运行良好。但在一个被动的情况下 - 没有。我应该修改什么来解决它?

this._form = this._formBuilder.group({
  description: ['', [Validators.required, Validators.pattern('.*[^\S].*')]]
}

1 个答案:

答案 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]