Angular2 模型驱动的表单验证器模式

Angular2 model-driven form validator pattern

我试图使表单只有在匹配特定模式时才有效。

它必须匹配:

123456789
123-456-789
123 458 789

这是我的模式:

^(\d{3}-\d{3}-\d{3})|(\d{3} \d{3} \d{3})|(\d{9})$

首先,有趣的是,为了能够在 Validator 上使用它,我似乎必须转义其中的每个斜杠。

Validators.pattern('^(\d{3}-\d{3}-\d{3})|(\d{3} \d{3} \d{3})|(\d{9})$')

我的问题是它不限制字符串总大小。

例如,它匹配 1234567890000,我希望它在 123456789 处停止,任何其他字符都会触发错误状态。

我尝试了这些变体:

Validators.pattern('^(\d{3}-\d{3}-\d{3})|(\d{3} \d{3} \d{3})|(\d{9})$')
Validators.pattern('(\d{3}-\d{3}-\d{3})|(\d{3} \d{3} \d{3})|(\d{9})')

另一个有趣的事实,如果我将其设置为:

Validators.pattern('\d{9}')

Validators.pattern('^\d{9}$')

那我只能设置正好9个字符

我确定这是一个正则表达式错误,但我不明白 Angular2 是否需要给他 ^$ 符号来分隔要评估的字符串。

设置 Validator.maxLength 将不允许用户键入超过给定长度的字符。

new FormControl('', Validators.maxLength(9)

您必须使用双反斜杠,因为模式作为字符串文字传递给正则表达式引擎,而正则表达式转义需要使用 \d\w 等的文字反斜杠

根据我从测试中看到的情况,angular 在模式周围添加了 ^$ 锚点 而没有分组 它。

这意味着,当您有交替组时,用分组结构包裹它们,这样锚点就可以应用于所有替代组。

您的 ^(\d{3}-\d{3}-\d{3})|(\d{3} \d{3} \d{3})|(\d{9})$ 和其他尝试的模式包含未包装的替代方案,因此 ^ 仅适用于 (\d{3}-\d{3}-\d{3})$ 仅适用于 (\d{9})

使用

'(?:\d{3}([- ])\d{3}\1\d{3}|\d{9})'

在验证器代码中,它将显示为 ^(?:\d{3}([- ])\d{3}\1\d{3}|\d{9})$,并且将像 in this demo.

一样工作

详细信息:该模式将匹配 2 个备选方案:

  • \d{3}([- ])\d{3}\1\d{3} - 3 位数字,- 或 space(捕获到第 1 组),然后是 3 位数字,然后是与第 1 组中相同的分隔符,然后是 3 位数字
  • | - 或
  • \d{9} - 9 位数

由于 ^$ 是由 angular 添加的,因此模式将需要完整的字符串匹配。