【问题标题】:Regex number validation isolating phone number and country code正则表达式号码验证隔离电话号码和国家代码
【发布时间】:2023-04-10 10:01:01
【问题描述】:

我对编写正则表达式几乎是全新的,但我有一个任务,我必须创建一个电话号码验证系统。

目前对我来说有点头疼。

我目前的进步使我:

^([+]45|[(][+]45[)]?|[(]0045[)]|0045)?\s*([0-9]{8})$

我需要实现两件事:

  1. 国家代码。 国家代码可以写成多种格式。

    1. 国家代码前加号
    2. 在国家/地区代码前加号,但在括号中
    3. 国家代码前加 00
    4. 国家/地区代码前有 00,但在括号中
  2. 电话号码 假定电话号码总是来自我的国家(这就是为什么国家代码总是
    也一样

当国家代码使用 00 时会出现问题。虽然我想要求电话号码为 8 位,但当国家代码为 0045 时,电话号码只需 4 位即可获得“真实”结果。

我只是不知道如何确保会发生这种情况。 这甚至可以以合理的方式完成吗?

【问题讨论】:

  • 举个例子和期望

标签: javascript regex validation


【解决方案1】:

要匹配不包括前缀的电话号码的 8 位数字,您可以匹配 +45 或 (45) 或 (0045) 或 0045 后跟 8 位数字。

或匹配 8 位数字,断言号码不以 00 开头的国家代码使用负前瞻 (?!00)

^(?:\+45|\(\+45\)|\(0045\)|0045|(?!00))\d{8}$

说明

  • ^ 字符串开始
  • (?:非捕获组
    • \+45|\(\+45\)|\(0045\)|0045|(?!00) 匹配任一替代项,或者在字符串的开头断言不是00
  • )关闭非捕获组
  • \d{8} 匹配 8 位数字
  • $字符串结束

Regex demo

【讨论】:

  • 问题是电话号码需要 8 位数字,而我的原始示例可以将 00451234 解释为 8 位电话号码,它实际上是国家代码和 4 位数字。
  • @UlrikKrogeSloth 我已经更新了答案。
  • 作为一个完整的正则表达式新手,只是想看看我是否理解正确: - 使用反斜杠是因为我不需要一组字符,但对于应该需要的单个字符? - 非捕获组从序列的其余部分中删除字符串部分?因此,在评估序列的其余部分时不考虑字符? - 负前瞻表示非捕获组不能以 00 开头,还是不能以 00 开头的“电话号码”?
  • @UlrikKrogeSloth (?: 表示法是非捕获组。它将备选方案 +45 (+45) (0045)0045 分组为匹配的有效选项。加号 \+ 之前的反斜杠用于转义字符以匹配文字加号,因为正则表达式中的加号本身具有特殊含义,即表示重复 1 次或多次的量词。否定的前瞻(?!00) 是一个非消耗性断言(不匹配任何内容),它要么是真要么是假,断言从当前位置直接向右不是00
  • 因此该模式匹配前 4 个备选方案中的 1 个,或者如果最后一个断言为真(则该部分将不匹配任何内容),然后匹配 8 个数字。
【解决方案2】:

我已将表达式更改为: ^(^([+]45|[(][+]45[)]?|[(]0045[)]|0045)?\s*([1-9]{1})([0-9 ]{7})$

这对我的目的有用

但以后可能需要更好的解决方案,因为国际号码也可能在以后被接受。

【讨论】:

  • 为什么 + 和 () 在括号中?我认为这些可能会逃脱而不是在括号中
  • 因为我是正则表达式的新手:D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-03
  • 1970-01-01
  • 2017-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多