我希望能匹配一个电话号码,它可以包含字母和可选的连字符:
我不知道如何在正则表达式中使用“if语句”。这是否可能?
- 这是有效的:
333-WELL
- 这也是有效的:
4URGENT
我不知道如何在正则表达式中使用“if语句”。这是否可能?
333-WELL
4URGENT
/^[a-zA-Z0-9]{3}-?[a-zA-Z0-9]{4}$/
它匹配3个字母或数字,后面是一个可选的连字符,然后是4个字母或数字。这个正则表达式在ruby中可以使用。根据你使用的正则表达式引擎,你可能需要稍微修改一下。
/^[a-zA-Z0-9]{3}-?[a-zA-Z0-9]{4}$/
(使用 ^
和 $
符号分别表示字符串的开头和结尾)。 - Dave DeLong您需要寻找交替运算符,用管道字符|
表示。
然而,您可能需要7个备选项(每个连字符位置一个+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}
用于匹配带连字符的字符串。
(?=^[^-]+-[^-]+$)
将匹配任何带有单个连字符的字符串(且连字符不是第一个或最后一个字符),然后 [A-Z0-9-]{8}
部分将计算字符并确保它们都是有效的。
我使用一个正则表达式,可以匹配两种模式: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
感谢 Heath Hunnicutt 提供的替代操作符解答以及示例。
根据他的建议,这是我的回答:
[A-Z0-9]{7}|[A-Z0-9][A-Z0-9-]{7}
注意:我已经在这里测试了我的正则表达式。(仅供参考)
0------
视为有效。 - jason