VB.net 中英国电话格式的 ASP 正则表达式
-
13-09-2019 - |
题
我想要 VB.net 中的电话字段的正则表达式验证器。请参阅以下要求:
电话格式应为 (+)xx-(0)xxxx-xxxxxx ext xxxx (可选)示例我的号码将显示为 44-7966-591739 屏幕格式将显示为 +44-(0)7966-591739 ext
请建议。
最好的问候,YUV
解决方案
:用于验证:强>结果 正如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.
其他提示
+44-(0)7966-591739
(0) 在电话号码显示中无效。去掉它。
电话:+44 7966 591739 或 07966 591739。
正则表达式模式在很多方面都是低效的:
(\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、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+)?)$
使用上面的模式从 $1 中提取“44”即可知道使用了国际格式,否则如果 $1 为空,则假定为国家格式。
从 $3 中提取可选分机号码详细信息并存储以供以后使用。
从 $2 中提取 NSN(包括空格、连字符和括号)。
步骤3:验证 NSN
删除 $2 中的空格、连字符和括号,并使用进一步的正则表达式模式来检查长度和范围并识别数字类型。
这些模式将更加简单,因为它们不必处理各种拨号前缀或国家/地区代码。
因此,匹配有效手机号码的模式非常简单:
^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
从不包括(0)在国际格式括号。
ITU 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