两个正则表达式模式,它们可以是一个吗?

时间:2009-07-01 15:04:58

标签: java regex

我有两个正则表达式用于验证Colorado驱动程序的许可证格式。

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

[0-9]{9}

我们必须只允许9位数,但用户可以自由输入123456789或12-345-6789。

有没有办法将这些结合成一个?像正则表达式的条件声明?现在我只是枚举所有可用的格式,一旦匹配就爆发。在进行比较之前我总是可以删除连字符,只使用[0-9]{9},但是我不会学习任何新东西。

4 个答案:

答案 0 :(得分: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 s。)

答案 1 :(得分:6)

只有在给出第一个连字符时才使用反向引用来匹配第二个连字符:

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

虽然我从未在Java中使用正则表达式,但如果支持它,则语法可能会有所不同。我刚刚在Ruby中试过这个。

答案 2 :(得分:3)

允许破折号或不破折号的简洁版本是:

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

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

答案 3 :(得分:0)

我认为这应该有效:

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