【问题标题】:Regex for phone # country code with area code电话号码的正则表达式国家代码和区号
【发布时间】:2015-10-26 01:08:24
【问题描述】:

我需要一个正则表达式来匹配这个国家代码+区号电话#格式:

1-201

前两个字符始终为1-,后三个字符为201989 之间的数字。

我目前有([1][\-][0-9]{3}) 指定1-xyz 和限制长度,但我怎样才能让最后一组来限制这些范围?

这将在 PHP 中使用。

【问题讨论】:

  • 这相当棘手。 RegEx 并不总是最好的答案,尤其是对于需要在 3 年内维护代码的可怜人来说。不过可以regular-expressions.info/numericranges.html
  • 仅仅因为你有正则表达式并不意味着你应该使用它们。此处的正则表达式很难阅读,并且会在其他人第一次必须更新时被丢弃。
  • 我不同意我的情况。从我所看到的情况来看,使用正则表达式验证电话号码格式相当普遍,将其插入测试仪可以轻松识别发生了什么。我是一个正则表达式白痴,我完全理解它。

标签: php regex pcre


【解决方案1】:

使用这个正则表达式:

^1\-(2\d[1-9])|([3-8]\d{2})|(9[0-8]\d)$

下面是对三个捕获组/范围的解释:

(2\d[1-9]) 匹配 201299
([3-8]\d{2}) 匹配 300899
(9[0-8]\d) 匹配 900989

这是一个链接,您可以在其中测试此正则表达式:

Regex101

更新:

显然 Laravel 不喜欢有这么多嵌套的捕获组,但是这种简化应该可以满足您的需求:

1-(2\d[1-9]|[3-8]\d{2}|9[0-8]\d)

【讨论】:

  • 这很奇怪,实际上它在测试站点上完美验证,但由于某种原因,使用它来验证我的 Laravel 应用程序中的路由在第二个和第三个子表达式上不起作用 - 它好像失败了字符串不匹配。
  • 试试这个:1-(2\d[1-9]|[3-8]\d{2}|9[0-8]\d)
  • 好吧,看起来 Laravel 被太多嵌套的捕获组阻塞了。我刚刚学到了一些东西:-)
【解决方案2】:

我不会为此使用正则表达式。它将变得混乱且难以维护。

我会这样做:

$strings = array('1-201', '1-298', '1-989', '1-999', '1-200');
foreach($strings as $string) {
    $value = explode('1-', $string);
    if($value[1] >= 201 & $value[1] <= 989) {
        echo 'In range' . $string  . "\n";
    } else {
        echo 'out of range' . $string . "\n";
    }
}

输出:

In range1-201
In range1-298
In range1-989
out of range1-999
out of range1-200

【讨论】:

    【解决方案3】:

    这应该可行,

    1-(20[1-9]|2[1-9][0-9]|[3-8][0-9][0-9]|9[0-8][0-9])
    

    或者,

    1-(20[1-9]|2[1-9]\d|[3-8]\d{2}|9[0-8]\d)
    

    来源:http://www.regular-expressions.info/numericranges.html

    【讨论】:

    • 虽然@Tim Biegeleisen 的回答有效,但由于某种原因,只有这个在我的 Laravel 5 应用程序中有效......
    • 我研究了 DarkSigma 的正则表达式并提高了我的知识。
    • @Tim 提供的正则表达式不会匹配 210、220、230 等,直到并包括 290,因为 2\d[1-9] 只允许“一列”中的数字 1 到 9,而不是零。
    【解决方案4】:

    我想我会在 C# 中这样做。实验过。

    string tester = "1-201";
    
    Match match = Regex.Match(tester, @"(?<one>1-)(?<Two>[0-9]{3})");
    
    //MessageBox.Show(match.Groups[2].Value);
    
    int x = Convert.ToInt32(match.Groups[2].Value);
    
    if (x <= 201 && x > 989)
    {
        //Exclude those captures not necessary.
        //Use the captures within the range.
    }
    

    【讨论】:

    • 但我的应用程序是 PHP 的。
    • 您只需要在 PHP 中获取等效的正则表达式,然后编写其余的代码。搜索将证明对您有用。
    猜你喜欢
    • 2023-04-10
    • 1970-01-01
    • 2020-12-15
    • 1970-01-01
    • 1970-01-01
    • 2021-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多