VB.net中英国电话格式的ASP正则表达式

时间:2009-09-23 09:16:07

标签: vb.net regex phone-number

我想在VB.net中为我的电话字段设置正则表达式验证器。请参阅以下要求:

电话格式应为(+)xx-(0)xxxx-xxxxxx ext xxxx(可选)示例我的号码将显示为44-7966-591739屏幕将被格式化为显示+ 44-(0)7966-591739分机

请建议。

最诚挚的问候, YUV

3 个答案:

答案 0 :(得分:2)

  +44-(0)7966-591739

(0)在电话号码显示中无效。删除它。

它是+44 7966 591739或07966 591739。

RegEx模式在多种方面效率低下:

  (\d{4}|\d{3})

以上简化为:

  \d{3,4}

存在更大的问题:

  ^(((+44\s?\d{4}|(?0\d{4})?)\s?\d{3}\s?\d{3})|((+44\s?\d{3}|(?0\d{3})?)\s?\d{3}\s?\d{4})|((+44\s?\d{2}|(?0\d{2})?)\s?\d{4}\s?\d{4}))(\s?#(\d{4}|\d{3}))?$

一旦找到领先的+44或前导0,为什么要一次又一次地搜索它?

  ^((+44\s?..|0..).....|(+44\s?..|0..).....|(+44\s?..|0..).....)

简化为

  ^(+44\s?|0)(.. .....|.. .....|.. .....)

但是,上述模式仅适用于英国4 + 6,3 + 7和2 + 8格式数字,而不适用于3 + 6,4 + 5,5 + 5和5 + 4格式数字。

模式不足。

电话号码验证和格式化需要分解为单独的步骤。允许多种输入格式,提取重要数字并丢弃各种拨号前缀,然后严格格式化国际或国家格式的剩余数字。

对于伦敦数字,带空格的正确格式为: +44 20 3555 7890或020 3555 7890或(020)3555 7890 没有空格: +442035557890或02035557890。

括号中的

(0)永远不会有效。不要使用它。

英国电话号码使用多种格式:2 + 8,3 + 7,3 + 6,4 + 6,4 + 5,5 + 5,5 + 4。有些用户不知道哪种格式与哪个数字范围有关,并且可能在输入时使用了错误的格式。让他们这样做;你对DIGITS感兴趣。

第1步:检查输入格式是否有效

确保输入看起来像英国电话号码。接受各种拨号前缀,+ 44,011 44​​,400 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,ext和可选的句点,或#,后跟分机号码数字。整个模式无需检查平衡括号,因为这些将在下一步中从数字中删除。

此时你不在乎这个号码是从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+)?)$

使用上述模式提取' 44'从$ 1知道使用国际格式,否则假设$ 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

答案 1 :(得分:0)

进行验证:
正如bobince指出的那样,你应该灵活处理电话号码,因为有很多方法可以输入它们。

验证值的一种简单而有效的方法是首先去除所有非数字值,然后确保它至少长度为11位,并且 - 如果您限制为英国数字 - 然后检查它是否以0开始或44。

我不能在查找vb.net语法时遇到麻烦,但有些事情就是这样:

if Phone.replaceAll('\D','').length < 11
    // Invalid Number
endif;

\D是任何非0-9的正则表达式。)


要根据要求格式化一个数字,假设您有一个相对固定的输入要显示到某个页面,这样的内容可能会有效:

取代:

(\d{2,3})\D*0?\D*(\d{4})\D*(\d{5})\D*(\d*)

使用:

+$1-(0)$2-$3 ext $4

这很灵活但不接受任何旧电话号码。它目前在开始时需要一个国际代码,我不太确定它们的规则是否能够完美地工作,但它可能足以满足您的需求。


在正则表达式注释模式下对该正则表达式的解释(因此可以在必要时直接用作正则表达式):

(?x)        # enable regex comment mode (whitespace ignored, hashes start comments)

# international code:
(\d{2,3})   # matches 3 or 2 digits; captured to group 1.

# optional 0 with potental spaces dashes or parens:
\D*         # matches as many non-digits as possible, none required.
0?          # optionally match a zero
\D*         # matches as many non-digits as possible, none required.

# main part of number:
(\d{4})     # match 4 digits; captured to group 2
\D*         # matches as many non-digits as possible, none required.
(\d{5})     # match 5 digits; captured to group 3.

# optional prefix:
\D*         # matches as many non-digits as possible, none required.
(\d*)       # match as many digits as possible, none required; captured to group 4.

答案 2 :(得分:0)

切勿在国际格式的括号中加入(0)。

国际电联E.123警告:http://www.itu.int/rec/T-REC-E.123-200102-I/en 同样如此:http://revk.www.me.uk/2009/09/it-is-not-44-0207-123-4567.html