我想匹配一个可以包含字母和可选连字符的电话号码:
333-WELL
4URGENT
换句话说,最多只能有一个连字符,但如果没有连字符,则最多可以有7个0-9或A-Z字符。
我不知道如何做和在正则表达式中“if statement”。这甚至可能吗?
答案 0 :(得分:5)
我认为应该这样做:
/^[a-zA-Z0-9]{3}-?[a-zA-Z0-9]{4}$/
它匹配3个字母或数字,后跟可选的连字符,后跟4个字母或数字。这个工作在红宝石。根据您正在使用的正则表达式引擎,您可能需要稍微改变它。
答案 1 :(得分: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])
答案 2 :(得分: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})$/;
这应该避免接受多个破折号,在错误的地方破折号等等......
答案 3 :(得分:1)
假设您希望连字符位于任何位置,lookarounds将对您有用。像这样:
^([A-Z0-9]{7}|(?=^[^-]+-[^-]+$)[A-Z0-9-]{8})$
此模式有两个主要部分:[A-Z0-9]{7}
匹配无连字符串,(?=^[^-]+-[^-]+$)[A-Z0-9-]{8}
匹配带连字符的字符串。
(?=^[^-]+-[^-]+$)
将匹配其中带有SINGLE连字符的任何字符串(并且连字符不是第一个或最后一个字符),然后[A-Z0-9-]{8}
部分将对字符进行计数并确保它们都是有效的。
答案 4 :(得分:0)
谢谢Heath Hunnicutt的交替操作员回答,并向我展示了一个例子。
基于他的建议,这是我的答案:
[A-Z0-9]{7}|[A-Z0-9][A-Z0-9-]{7}
注意:我测试了我的正则表达式here。 (仅供参考)