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

Ste*_*eod 3 java regex string

我很确定正则表达式是要走的路,但每当我尝试计算出特定的正则表达式时,我的头都会受伤.

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

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

Ric*_*dle 19

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

string s = test_string.toLowerCase();
if (s.contains("parsing") && (s.contains("error") || s.contains("warning")) {
    ....
Run Code Online (Sandbox Code Playgroud)

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

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

(?i)(?=.*parsing)(.*(error|warning).*)
Run Code Online (Sandbox Code Playgroud)

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


Joã*_*lva 6

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

(?i)(?=.*?(?:ERROR|WARNING))(?=.*?parsing).*
Run Code Online (Sandbox Code Playgroud)

例子:

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
Run Code Online (Sandbox Code Playgroud)