[\d -]{1}
明显不正确:数字或空格或连字符。
01000 123456
01000 不是有效的英国区号。 123456 不是有效的本地号码。
测试数据必须是实数区号和实数范围。
^\s*(?(020[7,8]{1})?[ ]?[1-9]{1}[0-9{2}[ ]?[0-9]{4})|(0[1-8]{1}[0-9]{3})?[ ]?[1-9]{1}[0-9]{2}[ ]?[0-9]{3})\s*|[0-9]+[ ]?[0-9]+$
由于许多不同的原因,上述模式是垃圾。
[7,8] 匹配 7 或逗号或 8。您不需要匹配逗号。
伦敦数字也以 3 开头,而不仅仅是 7 或 8。
伦敦 020 号码并不是唯一的 2+8 格式号码;另见 023、024、028 和 029。
[1-9]{1} 简化为 [1-9]
[ ]?简化为 \s?
一次找到了初始0,为什么还要一遍又一遍地寻找呢?
^(0....|0....|0....|0....)$ 简化为 ^0(....|....|....| ....)$
说真的。 ([1]|[2]|[3]|[7]){1} 在这里简化为 [1237]。
英国电话号码使用多种格式:2+8、3+7、3+6、4+6、4+5、5+5、5+4。一些用户不知道哪种格式适用于哪个数字范围,并且可能在输入时使用了错误的格式。让他们这样做;你对 DIGITS 感兴趣。
第 1 步:检查输入格式是否有效
确保输入看起来像英国电话号码。接受各种拨号前缀,+44、011 44、00 44,带或不带括号、连字符或空格;或带有前导 0 的国家格式。让用户对数字的其余部分使用他们想要的任何格式:(020) 3555 7788 或 00 (44) 203 555 7788 或 02035-557-788,即使它是错误的格式那个特定的数字。不要担心不平衡的括号。输入的重要部分是确保它是正确的位数。标点和空格无关紧要。
^\(?(?:(?:0(?:0|11)\)?[\s-]?\(?|\+)44\)?[\s-]?\(?(?:0\)?[\s-]?\(?)?|0)(?:\d{5}\)?[\s-]?\d{4,5}|\d{4}\)?[\s-]?(?:\d{5}|\d{3}[\s-]?\d{3})|\d{3}\)?[\s-]?\d{3}[\s-]?\d{3,4}|\d{2}\)?[\s-]?\d{4}[\s-]?\d{4}|8(?:00[\s-]?11[\s-]?11|45[\s-]?46[\s-]?4\d))(?:(?:[\s-]?(?:x|ext\.?\s?|\#)\d+)?)$
上述模式匹配可选的左括号,后跟 00 或 011 和可选的右括号,后跟可选的空格或连字符,然后是可选的左括号。或者,最初的左括号后面是文字 +,后面没有空格或连字符。前两个选项中的任何一个都紧跟 44 和可选的右括号,然后是可选的空格或连字符,然后是可选的括号中的可选 0,然后是可选的空格或连字符,然后是可选的左括号(国际格式)。或者,该模式匹配可选的初始左括号,后跟 0 中继代码(国家格式)。
前一部分之后是 NDC(区号)和 2+8、3+7、3+6、4+6、4+5、5+5 或 5+4 格式的用户电话号码带或不带空格和/或连字符。这还包括在用户认为区号结束和本地用户号码开始的位置之后提供可选的右括号和/或可选的空格或连字符。该模式允许任何格式与任何 GB 编号一起使用。如果用户在输入时使用了错误的数字格式,则必须通过后面的逻辑更正显示格式。
该模式以可选分机号码结尾,可选空格或连字符后跟 x、分机和可选句点,或 #,后跟分机号码数字。整个模式不会费心检查平衡括号,因为这些将在下一步中从数字中删除。
此时,您并不关心数字是从 01 还是 07 开始还是其他什么。您不在乎它是否是有效的区号。后续步骤将处理这些问题。
第 2 步:提取 NSN,以便更详细地检查其长度和范围
使用上述模式检查输入看起来像 GB 电话号码后,下一步是提取 NSN 部分,以便更详细地检查其有效性,然后以正确的方式格式化适用的号码范围.
^\(?(?:(?:0(?:0|11)\)?[\s-]?\(?|\+)(44)\)?[\s-]?\(?(?:0\)?[\s-]?\(?)?|0)([1-9]\d{1,4}\)?[\s\d-]+)(?:((?:x|ext\.?\s?|\#)\d+)?)$
使用上述模式从 $1 中提取 '44' 以知道使用了国际格式,否则如果 $1 为空则假定为国家格式。
从 $3 中提取可选的分机号码详细信息并将其存储起来以备后用。
从 $2 中提取 NSN(包括空格、连字符和括号)。
第 3 步:验证 NSN
从 $2 中删除空格、连字符和括号,并使用更多的 RegEx 模式来检查长度和范围并识别数字类型。
这些模式会简单得多,因为它们不必处理各种拨号前缀或国家代码。
匹配有效手机号码的模式因此很简单
^7([45789]\d{2}|624)\d{6}$
保费率是
^9[018]\d{8}$
每种号码类型将有许多其他模式:固定电话、业务费率、非地理、VoIP 等。
通过将问题分解为几个步骤,可以允许非常广泛的输入格式,并且非常详细地检查 NSN 的数字范围和长度。
第 4 步:存储号码
在提取和验证 NSN 后,将数字与国家/地区代码和所有其他数字一起存储,不带空格或标点符号,例如442035557788.
第 5 步:格式化数字以供显示
另一组简单规则可用于格式化数字,并在开头添加必要的 +44 或 0。
03开头的数字规则是
^44(3\d{2})(\d{3])(\d{4})$
格式化为
0$1 $2 $3 or as +44 $1 $2 $3
对于以 02 开头的数字是
^44(2\d)(\d{4})(\d{4})$
格式化为
(0$1) $2 $3 or as +44 $1 $2 $3
完整的列表很长。我可以将它全部复制并粘贴到这个线程中,但是随着时间的推移,很难在多个地方维护这些信息。目前可以在以下位置找到完整列表:http://aa-asterisk.org.uk/index.php/Regular_Expressions_for_Validating_and_Formatting_GB_Telephone_Numbers