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

Java 两个正则表达式模式,可以是一个吗?,java,regex,Java,Regex,我有两个正则表达式,用于验证科罗拉多州驾照格式 [0-9]{2}[-][0-9]{3}[-][0-9]{4} 及 我们只允许9位数字,但用户可以自由输入123456789或12-345-6789 有没有办法把这些结合起来?像某种正则表达式条件语句?现在我只是简单地列举了所有可用的格式,并在其中一个匹配后进行分析。在进行比较之前,我总是可以去掉连字符,只使用[0-9]{9},但这样我就不会学到任何新东西了。对于直联收割机 (?:[0-9]{2}[-][0-9]{3}[-][0-9]{4}|[0-

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

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

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


有没有办法把这些结合起来?像某种正则表达式条件语句?现在我只是简单地列举了所有可用的格式,并在其中一个匹配后进行分析。在进行比较之前,我总是可以去掉连字符,只使用
[0-9]{9}
,但这样我就不会学到任何新东西了。

对于直联收割机

(?:[0-9]{2}[-][0-9]{3}[-][0-9]{4}|[0-9]{9})
或合并逻辑(允许破折号在一个位置而不在另一个位置,这可能是不需要的)

(第一个正则表达式中连字符周围的括号没有任何作用。)

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

(?:\d{2}-\d{3}-|\d{5})\d{4}

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

我认为这应该有效:

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

仅当给定第一个连字符时,使用反向引用匹配第二个连字符如何:

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

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

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

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

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

第二个版本允许一个破折号,我认为这不是期望的结果。谢谢。在这里测试你的例子:给了我我想要的确切结果。另外,感谢关于[-]和\d的提示。您最终使用了哪个版本?我使用了:(?:\d{2}-\d{3}-\d{5})\d{4}+1:我不会在这种情况下使用它,但我喜欢它的技巧。语法在Java中是相同的,但是如果您以字符串文字的形式编写它,您必须避开反斜杠:“\\d{2}(-?\\d{3}\\d{1\\d{4}”,稍后通过查看$1(至少在Perl中)可以知道它是什么格式。我从没想到过那个装置。
\d{2}(-?)\d{3}\1\d{4}
\d{2}(-?)\d{3}\1\d{4}