匹配电话号码的正则表达式?

3
我希望能匹配一个电话号码,它可以包含字母和可选的连字符:
  • 这是有效的:333-WELL
  • 这也是有效的:4URGENT
换句话说,最多只能有一个连字符,但如果没有连字符,则最多可以有七个0-9或A-Z字符。
我不知道如何在正则表达式中使用“if语句”。这是否可能?

已经有一个答案被接受了,但我想知道:这个连字符可以出现在数字的任何位置吗?还是必须始终(如果有的话)在第三和第四位数字之间? - Carl Smotricz
你有需要使用正则表达式的原因吗? - Esteban Küber
1
@Carl Smotricz:它可能出现在任何地方。好问题。 - sivabudh
@voyager:我正在编写XSD限制模式facet。所以,是的,我需要使用正则表达式。 - sivabudh
6个回答

5
我认为这应该可以解决问题:
/^[a-zA-Z0-9]{3}-?[a-zA-Z0-9]{4}$/

它匹配3个字母或数字,后面是一个可选的连字符,然后是4个字母或数字。这个正则表达式在ruby中可以使用。根据你使用的正则表达式引擎,你可能需要稍微修改一下。


我有一个问题。所以我测试了上面的正则表达式,它运行良好。然而,当我在末尾添加更多数字时,正则表达式验证器仍然说它是有效的。为什么会这样?难道一旦我添加一个字符,表达式不应该变得无效吗?我在http://tools.netshiftmedia.com/regexlibrary/上使用121333333进行测试。 - sivabudh
2
@ShaChris23 因为 121333333 在开头也匹配到了这个模式。为了真正的全长匹配,应该使用 /^[a-zA-Z0-9]{3}-?[a-zA-Z0-9]{4}$/(使用 ^$ 符号分别表示字符串的开头和结尾)。 - Dave DeLong
谢谢你,Dave!哇...我感觉从这个例子中学到了很多。(^_^) - sivabudh
这是一个非常好的答案。在某些方面,它比我的(被接受的)答案更好。 - Heath Hunnicutt

4

您需要寻找交替运算符,用管道字符|表示。

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

交替运算符的一个用途是定义两个备选项,例如:

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

1

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

#!/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})$/;

这样可以避免接受多个破折号,破折号放错位置等问题...


1

假设您想允许连字符出现在任何位置,环视 将对您有所帮助。可以像这样:

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

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

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


1
注意:在测试正则表达式后,我修改了我的答案。 - Artelius

0

我使用一个正则表达式,可以匹配两种模式:7个字母数字字符或者3个字母数字字符、一个连字符和4个字母数字字符。

def check_string(string):
    if re.match(r'^[A-Z0-9]{7}$|^[A-Z0-9]{3}-[A-Z0-9]{4}$', string):
        return True
    else:
        return False

0

感谢 Heath Hunnicutt 提供的替代操作符解答以及示例。

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

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

注意:我已经在这里测试了我的正则表达式。(仅供参考)


1
这将把 0------ 视为有效。 - jason

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接