0

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

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

请建议。

最好的问候,尤夫

4

3 回答 3

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)(.. .....|.. .....|.. .....)

但是,上述模式仅适用于 UK 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。一些用户不知道哪种格式适用于哪个数字范围,并且可能在输入时使用了错误的格式。让他们这样做;你对数字感兴趣。

第 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

于 2012-11-09T09:37:31.873 回答
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.
于 2009-11-03T00:14:58.603 回答
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

于 2011-02-20T11:32:10.010 回答