0

我有这三个正则表达式。它们单独工作,但我想将它们合并为一个模式。

regex1 = [0-9]{16}
regex2 = [0-9]{4}[-][0-9]{4}[-][0-9]{4}[-][0-9]{4}
regex3 = [0-9]{4}[ ][0-9]{4}[ ][0-9]{4}[ ][0-9]{4}

我使用这种方法:

Pattern.compile(regex);

哪个是合并它们的正则表达式字符串?

4

2 回答 2

5

您可以使用反向引用

[0-9]{4}([ -]|)([0-9]{4}\1){2}[0-9]{4}

仅当分隔符全部为

  • 空间
  • 连字符
  • 空白的

\1意思是“这完全匹配第一个捕获组- 括号中的表达式 - 匹配”。

由于([ -]|)是该组,因此其他两个分隔符都需要相同才能匹配模式。

您可以将其进一步简化为:

\d{4}([ -]|)(\d{4}\1){2}\d{4}
于 2012-11-03T15:37:36.367 回答
1

以下应该匹配三个模式匹配的任何内容:

regex = [0-9]{4}[- ]?[0-9]{4}[- ]?[0-9]{4}[- ]?[0-9]{4}

也就是说,我假设您对数字之间的连字符、空格什么都没有感到满意?

注意:这也将匹配您拥有三者任意组合的情况,例如

0000-0000 00000000

这可能不是我们想要的?


或者,如果您需要匹配三个单独的模式中的任何一个,则只需将它们与 连接|,如下所示:

([0-9]{16})|([0-9]{4}-[0-9]{4}-[0-9]{4}-[0-9]{4})|([0-9]{4} [0-9]{4} [0-9]{4} [0-9]{4})

(您的原始示例似乎在空格和连字符周围有不必要的方括号)

于 2012-11-03T15:21:15.550 回答