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

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

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

我不知道该怎么做,并且在正则表达式中“ if语句”。那甚至可能吗?

有帮助吗?

解决方案

您寻找带有管道特征的交替操作员: |

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

交替操作员的一种用途定义了两个替代方案,如:

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

其他提示

我认为这应该做到:

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

它与3个字母或数字匹配,然后是可选连字符,然后是4个字母或数字。这个在Ruby中起作用。根据您使用的Regex引擎,您可能需要稍微更改它。

不确定这是否很重要,但我会将其分为两个言论:

#!/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} 部分将计算字符并确保它们都是有效的。

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

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

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

注意:我测试了我的言论 这里. 。 (包括此供参考)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top