繁体   English   中英

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

[英]Regular expression to match phone number?

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

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

换句话说,最多只能有一个连字符,但如果没有连字符,则最多可以有7个0-9或AZ字符。

我不知道如何做和正则表达式中的“if statement”。 这甚至可能吗?

我认为应该这样做:

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

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

您寻找交替运算符,用管道符号表示: |

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

交替运算符的一种用途定义了两种选择,如:

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

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

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

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

假设你想让连字符在任何地方,你可以使用外观 像这样的东西:

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

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

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

谢谢Heath Hunnicutt的交替操作员回答,并向我展示了一个例子。

基于他的建议,这是我的答案:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM