如何在Java的正则表达式中使用OR?

时间:2015-11-25 10:03:53

标签: java regex

我想接受这两种情况,I_LOVE_TO_CODE.txtI_LOVE_TO_CODE_20151125.txt。我知道如何分别为每一个人做:

^I_LOVE_TO_CODE.txt$
^I_LOVE_TO_CODE_\d{8}\.txt$

但是如何在一个正则表达式中插入OR条件?

3 个答案:

答案 0 :(得分:8)

在这种情况下,您不需要| OR )运算符,因为它将是一个低效的解决方案。 ^I_LOVE_TO_CODE_\d{8}\.txt$|^I_LOVE_TO_CODE\.txt$涉及很多回溯。你可以将它收缩到^(I_LOVE_TO_CODE_\d{8}\.txt|I_LOVE_TO_CODE\.txt)$(其中锚点适用于两个子表达式,但只使用一次),或^I_LOVE_TO_CODE(_\d{8}\.txt|)$ - 这已经好多了,交替可以完全避免在这里使用可选分组

在此处使用可选组:

^I_LOVE_TO_CODE(?:_\d{8})?\.txt$
               ^^^      ^^ 

请参阅regex demo

(?:_\d{8})?表示匹配下划线,后跟8位数一次或零次,但不捕获子串。除非您需要使用该值,否则无需捕获((_\d{8})?)组。

alternation operatoroptional items的详细信息,请访问Regular-Expressions.info

答案 1 :(得分:1)

在您尝试匹配的模式的特定情况下,其中一个模式与另一个模式相同,只需“在中间添加一点”,您可以使用可选组,如stribizhev建议的那样。 / p>

如果您尝试匹配两个(或更多)内容中的任何一个,您可以使用|运算符,如Pattern javadoc中所述:

"^(?:foo|bar|baz)$"

会匹配"foo""bar""baz"

答案 2 :(得分:0)

我完全不明白你的问题。在正则表达式中,您可以使用|来确定|之前的值或之后的值。

您可以将它们保存在不同的变量中,例如:

String var01= "your route to the .txt file";
String var02= "your route to the .txt file";
String regex= "your regex";

之后,您可以使用if语句,如:

if((var01||var02).matches(regex)) {
    System.out.println("Succes!");
}
else {
    System.out.println("Validation failed!");
}

请注意,如果验证已成功匹配,则.matches会返回true boolean