【问题标题】:Regular expression to match phone number?正则表达式匹配电话号码?
【发布时间】:2010-12-16 17:45:06
【问题描述】:

我想匹配一个可以包含字母和可选连字符的电话号码:

  • 这是有效的:333-WELL
  • 这也是有效的:4URGENT

换句话说,最多可以有一个连字符,但如果没有连字符,则最多可以有七个 0-9 或 A-Z 字符。

我不知道如何在正则表达式中执行“if 语句”。这可能吗?

【问题讨论】:

  • 答案已被接受,但我想知道:该连字符可以在数字中的任何位置,还是必须始终(如果有的话)在第 3 和第 4 位之间?跨度>
  • 您是否有理由需要使用正则表达式?
  • @Carl Smotricz:它可以在任何地方。好问题。
  • @voyager:我正在编写 XSD 限制模式方面。所以是的,我需要使用正则表达式。

标签: regex phone-number


【解决方案1】:

您寻找交替运算符,用竖线字符表示:|

但是,您可能需要 7 个备选方案(每个连字符位置 1 个 + 没有连字符位置 1 个),或者您可能需要第 3 和第 4 个字符之间的连字符并使用 2 个备选方案。

交替操作符的一次使用定义了两种选择,如下所示:

({3,3}[0-9A-Za-z]-{4,4}[0-9A-Za-z]|{7,7}[0-9A-Za-z])

【讨论】:

    【解决方案2】:

    假设您想让连字符出现在任何位置,lookarounds 将对您有用。像这样的:

    ^([A-Z0-9]{7}|(?=^[^-]+-[^-]+$)[A-Z0-9-]{8})$
    

    此模式有两个主要部分:[A-Z0-9]{7} 匹配无连字符字符串,(?=^[^-]+-[^-]+$)[A-Z0-9-]{8} 匹配连字符字符串。

    (?=^[^-]+-[^-]+$) 将匹配其中包含单个连字符的任何字符串(并且连字符不是第一个或最后一个字符),然后[A-Z0-9-]{8} 部分将计算字符并确保它们都是有效的。

    【讨论】:

    • 注意:我在测试正则表达式后修改了答案。
    【解决方案3】:

    我认为应该这样做:

    /^[a-zA-Z0-9]{3}-?[a-zA-Z0-9]{4}$/
    

    它匹配 3 个字母或数字,后跟一个可选的连字符,后跟 4 个字母或数字。这个在红宝石中工作。根据您使用的正则表达式引擎,您可能需要稍微改变它。

    【讨论】:

    • 我有一个问题..所以我测试了上面的正则表达式,它工作正常。但是,当我在末尾添加更多数字时,正则表达式验证器仍然说它是有效的。这是为什么?一旦我再添加 1 个字符,表达式不应该变得无效吗?我使用 121333333 在tools.netshiftmedia.com/regexlibrary 测试
    • @ShaChris23 因为 121333333 在开头也匹配它。对于真正的全长匹配,它将是 /^[a-zA-Z0-9]{3}-?[a-zA-Z0-9]{4}$/(使用 ^$ 符号分别表示字符串的开头和字符串的结尾)
    • 谢谢你,戴夫!哇..我觉得我从这个例子中学到了很多东西。 (^_^)
    • 这是一个非常好的答案。在某些方面,它比我(接受的)答案更好。
    【解决方案4】:

    不确定这是否重要,但我会将其分成两个正则表达式:

    #!/usr/bin/perl
    
    use strict;
    use warnings;
    
    my $text = '333-URGE';
    
    print "Format OK\n" if $text =~ m/^[\dA-Z]{1,6}-?[\dA-Z]{1,6}$/;
    print "Length OK\n" if $text =~ m/^(?:[\dA-Z]{7}|[\dA-Z-]{8})$/;
    

    这应该避免接受多个破折号,破折号在错误的地方等等......

    【讨论】:

      【解决方案5】:

      感谢 Heath Hunnicutt 的交替运算符回答以及向我展示的示例。

      根据他的建议,这是我的答案:

      [A-Z0-9]{7}|[A-Z0-9][A-Z0-9-]{7}
      

      注意:我测试了我的正则表达式 here。 (仅包括此供参考)

      【讨论】:

      • 这将认为0------ 是有效的。
      猜你喜欢
      • 2020-01-18
      • 2022-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多