我想接受这两种情况,I_LOVE_TO_CODE.txt
或I_LOVE_TO_CODE_20151125.txt
。我知道如何分别为每一个人做:
^I_LOVE_TO_CODE.txt$
^I_LOVE_TO_CODE_\d{8}\.txt$
但是如何在一个正则表达式中插入OR
条件?
答案 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 operator和optional 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
。