我有两个正则表达式用于验证Colorado驱动程序的许可证格式。
[0-9]{2}[-][0-9]{3}[-][0-9]{4}
和
[0-9]{9}
我们必须只允许9位数,但用户可以自由输入123456789或12-345-6789。
有没有办法将这些结合成一个?像正则表达式的条件声明?现在我只是枚举所有可用的格式,一旦匹配就爆发。在进行比较之前我总是可以删除连字符,只使用[0-9]{9}
,但是我不会学习任何新东西。
答案 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}