我有这三个正则表达式。它们单独工作,但我想将它们合并为一种模式。
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);
合并它们的正则表达式字符串是什么?
答案 0 :(得分:5)
您可以使用backreferences:
[0-9]{4}([ -]|)([0-9]{4}\1){2}[0-9]{4}
只有在分隔符全部为
时才会匹配 \1
表示“这与括号中的第一个capturing group - 表达式完全匹配 - 匹配”。
由于([ -]|)
是该组,因此要匹配的模式的其他两个分隔符必须相同。
您可以simplify it further来:
\d{4}([ -]|)(\d{4}\1){2}\d{4}
答案 1 :(得分: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})
(您的原始示例似乎在空格和连字符周围有不必要的方括号)