4

我正在尝试在 Angular 2/4 中实现一个表单。有一个电话号码字段。我使用正则表达式作为

pattern="^\s*(?:\+?(\d{1,3}))?[- (]*(\d{3})[- )]*(\d{3})[- ]*(\d{4})(?: *[x/#]{1}(\d+))?\s*$"

在相应的输入字段中。它接受几乎所有格式,但不接受以下格式:

  1. 754-3010(本地)

  2. (541) 754-3010(国内)

  3. +1-541-754-3010(国际)

更重要的是,它应该接受 +、-、( 和 ) 字符。

希望有人可以提供帮助

4

1 回答 1

4

您可以使用可选的非捕获组将正则表达式的一部分设为可选。

利用

^\s*(?:\+?\d{1,3})?[- (]*\d{3}(?:[- )]*\d{3})?[- ]*\d{4}(?: *[x/#]\d+)?\s*$
                              ^^^           ^^

查看正则表达式演示

请注意,这{1}是多余的,您可以将其删除。

至于捕获组,如果需要,您可以保留原始组,但如果您只是验证,我宁愿删除它们。

细节

  • ^- 字符串的开头
  • \s*- 0+ 个空格
  • (?:\+?\d{1,3})?- 可选序列:
    • \+?- 可选(1 或 0)+符号
    • \d{1,3}- 任何 1 到 3 位数字
  • [- (]* -a -,空格或(
  • \d{3}- 任意 3 位数字
  • (?:[- )]*\d{3})?- 可选序列:
    • [- )]*- 0+ -, 空格或)
    • \d{3}- 任意 3 位数字
  • [- ]*- 0+ 个空格或-
  • \d{4}- 任意 4 位数字
  • (?: *[x/#]\d+)?
  • \s*- 0+ 个空格
  • $- 字符串结束。
于 2017-09-27T06:13:59.270 回答