2

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

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

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

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

4

5 回答 5

5

我认为应该这样做:

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

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

于 2009-11-15T05:36:47.010 回答
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])
于 2009-11-15T05:29:46.340 回答
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})$/;

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

于 2009-11-15T05:41:48.997 回答
1

假设您想让连字符出现在任何地方,环顾四周对您很有用。像这样的东西:

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

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

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

于 2009-11-15T05:45:39.063 回答
0

感谢 Heath Hunnicutt 的交替操作员回答以及向我展示的示例。

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

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

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

于 2009-11-15T05:34:26.640 回答