两个正则表达式模式,可以合并成一个吗?

3

我有两个正则表达式,用于验证科罗拉多州驾照的格式。

[0-9]{2}[-][0-9]{3}[-][0-9]{4}

and

[0-9]{9}

我们需要允许只有9个数字,但用户可以输入123456789或12-345-6789。我能否将它们合并为一个?类似于正则表达式的条件语句吗?目前,我只是枚举所有可用格式,并在匹配一个后退出。我可以在比较之前去掉连字符并仅使用[0-9]{9},但这样我就学不到任何新东西了。
4个回答

12

对于一个简单的合并操作,

(?:[0-9]{2}[-][0-9]{3}[-][0-9]{4}|[0-9]{9})

或者合并逻辑(允许一个位置有破折号而另一个位置没有破折号,这可能不是所期望的),

[0-9]{2}-?[0-9]{3}-?[0-9]{4}
(你第一个正则表达式中连字符周围的括号没有任何作用。)或者将逻辑合并,以便如果有一个连字符则需要两个。
(?:\d{2}-\d{3}-|\d{5})\d{4}

(你的[0-9]也可以用\d替换。)


第二个版本允许一个破折号,我认为这不是期望的结果。 - cletus
谢谢。在这里测试您的例子:http://www.fileformat.info/tool/regex.htm 给了我想要的确切结果。此外,感谢您关于 [-] 和 \d 的提示。 - northpole
你最终使用了哪个版本? - chaos
我使用了:(?:\d{2}-\d{3}-|\d{5})\d{4} - northpole

6
如何使用反向引用仅在给定第一个连字符时匹配第二个连字符:
\d{2}(-?)\d{3}\1\d{4}

尽管我从未在Java中使用过正则表达式,但如果支持,语法可能会有所不同。我只是在Ruby中尝试了一下。

1
+1:我不会在这种情况下使用它,但我喜欢它的巧妙。 - chaos
Java中的语法相同,但如果您将其写成字符串文字形式,则必须转义反斜杠:“\d{2}(-?)\d{3}\1\d{4}”。 - Alan Moore

3
一个简洁的版本,可以允许使用破折号或不使用破折号:
```html

一个简洁的版本,可以允许使用破折号或不使用破折号:

```
\d{2}(-?)\d{3}\1\d{4}

捕获组(括号)将捕获“-”或空。\1将再次匹配任何被捕获的内容。

此外,您可以通过查看$1(至少在Perl中)来确定它是什么格式。我从未想过那个设备。 - Jon Ericson

0

我认为这应该可以工作:

\d{2}-?\d{3}-?\d{4}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接