如何查找Java String是否包含X或Y并包含Z.

我很确定正则表达式是可行的方法,但每当我尝试计算出特定的正则表达式时,我的头脑都会受伤。

如果Java String(包含文本“ERROR”或文本“WARNING”)AND(包含文本“parsing”),我需要找到什么正则表达式,其中所有匹配都不区分大小写?

编辑:我提出了一个具体案例,但我的问题更为笼统。 可能还有其他条款,但它们都涉及匹配特定单词,忽略大小写。 可能有1,2,3或更多条款。

如果你对正则表达式不是很满意,不要试图将它们用于这样的事情。 只需这样做:

string s = test_string.toLowerCase(); if (s.contains("parsing") && (s.contains("error") || s.contains("warning")) { .... 

因为当你六个月后回到你的代码时,你会一眼就能理解它。

编辑:这是一个正则表达式:

 (?i)(?=.*parsing)(.*(error|warning).*) 

但效率很低。 对于具有OR条件的情况,在可读性和效率方面,搜索几个简单正则表达式并以编程方式将结果与Java组合的混合方法通常是最佳的。

如果您真的想使用正则表达式,可以使用正向前瞻操作符:

 (?i)(?=.*?(?:ERROR|WARNING))(?=.*?parsing).* 

例子:

 Pattern p = Pattern.compile("(?=.*?(?:ERROR|WARNING))(?=.*?parsing).*", Pattern.CASE_INSENSITIVE); // you can also use (?i) at the beginning System.out.println(p.matcher("WARNING at line X doing parsing of Y").matches()); // true System.out.println(p.matcher("An error at line X doing parsing of Y").matches()); // true System.out.println(p.matcher("ERROR Hello parsing world").matches()); // true System.out.println(p.matcher("A problem at line X doing parsing of Y").matches()); // false 

尝试:

  If((str.indexOf("WARNING") > -1 || str.indexOf("ERROR") > -1) && str.indexOf("parsin") > -1) 

我通常使用这个小程序来试验reg。 恩。 表达式可能如下所示:

 if (str.matches("(?i)^.*?(WARNING|ERROR).*?parsing.*$")) { ... 

但正如上面的答案所述,最好不要使用reg。 恩。 这里。

这里不需要正则表达式。 尝试这个:

 if((string1.toUpperCase().indexOf("ERROR",0) >= 0 || string1.toUpperCase().indexOf("WARNING",0) >= 0 ) && string1.toUpperCase().indexOf("PARSING",0) >= 0 ) 

这也照顾不区分大小写的标准

我认为这个正则表达式可以解决问题(但必须有更好的方法):

 (.*(ERROR|WARNING).*parsing)|(.*parsing.*(ERROR|WARNING)) 

如果你想要匹配可变数量的单词,我会做类似的事情:

 String mystring = "Text I want to match"; String[] matchings = {"warning", "error", "parse", ....} int matches = 0; for (int i = 0; i < matchings.length(); i++) { if (mystring.contains(matchings[i]) { matches++; } } if (matches == matchings.length) { System.out.println("All Matches found"); } else { System.out.println("Some word is not matching :("); } 

注意:我没有编译此代码,因此可能包含拼写错误。

使用多个.*构造,解析器将调用数千次“退避并重试”试用版匹配。

切勿在RegEx模式的开头或中间使用.*