【问题标题】:Regex number phone [duplicate]正则表达式号码电话[重复]
【发布时间】:2011-09-04 18:20:32
【问题描述】:

我的话(电话号码)可能以“00”或“+”开头。

电话号码示例:

00xxx xx xxxxxxx
+xxx xx xxxxxxx
(+xxx) xx xxxxxxx
(00xxx) xx xxxxxxx

我有:

Regex regexObj = new Regex(@"^\(?[+( ]?([0-9]{3})\)?[) ]?([0-9]{2})[- ]?([0-9]{7})$");

if (regexObj.IsMatch(TextBox1.Text))
{
    // IF OK
    string formattedPhoneNumber = regexObj.Replace(TextBox1.Text, "(+$1) $2 $3");
}

如何把它放在正则表达式中?现在我只能放“+”和“(”,“)”

谢谢

【问题讨论】:

    标签: c# .net asp.net regex validation


    【解决方案1】:

    把工作分成几个步骤。

    在调查号码的其余部分之前,第一步必须去掉 +353、00 353、011 353、+353 (0)、00 353 (0)、011 353 (0) 或 0 前缀。

      Pattern: ^(\(?(?:0(?:0|11)\)?[\s-]?\(?|\+)(353)\)?[\s-]?)?\(?0?(?:\)[\s-]?)?([1-9]\d{1,4}\)?[\d\s-]+)((?:x|ext\.?|\#)\d{3,4})?$
    

    使用上述模式从 $2 中提取 '353' 以知道使用了国际格式,否则如果 $2 为空,则假定为国家格式。

    从 $4 中提取可选的分机号码详细信息并将其存储起来以备后用。

    从 $3 中提取 NSN(包括空格、连字符和括号)。

    删除那些空格、连字符和括号,并使用另一种更详细的 RegEx 模式通过长度和初始数字验证数字的 NSN 部分。

    不用担心用户输入不匹配的括号或随机标点符号。目标是确保用户输入正确的位数以生成有效的电话号码。提取并验证该数字,然后使用每个数字范围的正确格式规则将其清理以显示。

    【讨论】:

      【解决方案2】:

      【讨论】:

        【解决方案3】:

        这个怎么样:

        Regex regexObj = new Regex(@"^(?:\(?)(?:\+|0{2})([0-9]{3})\)? ([0-9]{2}) ([0-9]{7})$");
        

        编辑:

        ^(?:\((?:\+|00)([0-9]{3})\)|(?:\+|00)([0-9]{3}))? ([0-9]{2})[- ]?([0-9]{7})$
        

        【讨论】:

        • 此答案不正确匹配:“00353) 86 5551212”、“(00353 86 5551212”、“+00353 86 5551212”
        • 我发现它匹配 "00353) 86 5551212", "(00353 86 5551212" 就好了。我承认 "+00xxx xx xxxxxxx" 是个问题并相应地更新了它
        • 但是@Beno - 这不是一个有效的电话号码......
        • 终于明白你在说什么了——你的第一条评论让我很困惑,因为“+00353 86 5551212”与第一个正则表达式不匹配。我已经更新了答案
        【解决方案4】:

        用你的例子测试过:

        Regex regexObj = new Regex(@"^(?:(?:\+|00)([0-9]{3})|\((?:\+|00)([0-9]{3})\))[- ]?([0-9]{2})[- ]?([0-9]{7})$");
        
        if (regexObj.IsMatch(TextBox1.Text))
        {
            //IF OK
            string formattedPhoneNumber = regexObj.Replace(TextBox1.Text, "(+$1$2) $3 $4");
        }
        

        解释:

        (?:\+|00): +00 - 没有捕获

        (?:(?:\+|00)([0-9]{3})|\((?:\+|00)([0-9]{3})\)): +xxx or 00xxx or (+xxx) or (00xxx),只捕获数字。分开 ( ) 匹配非常重要,这样如果包含括号,则两者都必须存在以进行匹配(即 (+999 99 9999999 将无效。

        "(+$1$2) $3 $4":匹配将捕获第一个或第二个 ([0-9]{3}) 组,但不能同时捕获两者 - 必须在此处将它们结合起来。

        【讨论】:

          【解决方案5】:

          这可以选择匹配您的 4 个不同的电话前缀,后跟 2 位数字,然后是 7 位数字。

          (?:(00\d{3})|(\+\d{3})|(\(\+\d{3}\))|(\(00\d{3}\)))\s(\d{2})\s(\d{7})

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-03-02
            • 1970-01-01
            • 2013-08-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-09-23
            • 2014-02-15
            相关资源
            最近更新 更多