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

nor*_*ole 3 java regex

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

[0-9]{2}[-][0-9]{3}[-][0-9]{4}
Run Code Online (Sandbox Code Playgroud)

[0-9]{9}
Run Code Online (Sandbox Code Playgroud)

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

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

cha*_*aos 12

对于直接组合,

(?:[0-9]{2}[-][0-9]{3}[-][0-9]{4}|[0-9]{9})
Run Code Online (Sandbox Code Playgroud)

或合并逻辑(允许破折号在一个位置而不是另一个,这可能是不可取的),

[0-9]{2}-?[0-9]{3}-?[0-9]{4}
Run Code Online (Sandbox Code Playgroud)

(第一个正则表达式中连字符周围的括号没有做任何事情.)

或者合并逻辑,以便如果存在连字符,则需要两个连字符,

(?:\d{2}-\d{3}-|\d{5})\d{4}
Run Code Online (Sandbox Code Playgroud)

(您的[0-9]s也可以替换为\ds.)


Nef*_*byr 6

如果给出第一个连字符,则使用反向引用来匹配第二个连字符怎么样:

\d{2}(-?)\d{3}\1\d{4}
Run Code Online (Sandbox Code Playgroud)

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