【发布时间】:2010-11-29 02:25:19
【问题描述】:
我很确定正则表达式是要走的路,但每当我试图计算出特定的正则表达式时,我的头就会很痛。
如果 Java 字符串(包含文本“ERROR”或文本“WARNING”)和(包含文本“解析”),其中所有匹配项都不区分大小写,我需要查找什么正则表达式?
编辑:我提出了一个具体案例,但我的问题更普遍。可能还有其他子句,但它们都涉及匹配特定单词,忽略大小写。可能有 1、2、3 个或更多子句。
【问题讨论】:
我很确定正则表达式是要走的路,但每当我试图计算出特定的正则表达式时,我的头就会很痛。
如果 Java 字符串(包含文本“ERROR”或文本“WARNING”)和(包含文本“解析”),其中所有匹配项都不区分大小写,我需要查找什么正则表达式?
编辑:我提出了一个具体案例,但我的问题更普遍。可能还有其他子句,但它们都涉及匹配特定单词,忽略大小写。可能有 1、2、3 个或更多子句。
【问题讨论】:
如果您对正则表达式不是 100% 满意,请不要尝试将它们用于此类事情。只需这样做:
string s = test_string.toLowerCase();
if (s.contains("parsing") && (s.contains("error") || s.contains("warning")) {
....
因为当您在六个月后回到您的代码时,您会一眼就明白。
编辑:这是一个正则表达式:
(?i)(?=.*parsing)(.*(error|warning).*)
但它的效率相当低。对于具有 OR 条件的情况,搜索几个简单的正则表达式并将结果与 Java 以编程方式组合的混合方法通常是最好的,无论是在可读性还是效率方面。
【讨论】:
尝试:
If((str.indexOf("WARNING") > -1 || str.indexOf("ERROR") > -1) && str.indexOf("parsin") > -1)
【讨论】:
这里不需要正则表达式。试试这个:
if((string1.toUpperCase().indexOf("ERROR",0) >= 0 ||
string1.toUpperCase().indexOf("WARNING",0) >= 0 ) &&
string1.toUpperCase().indexOf("PARSING",0) >= 0 )
这也考虑了不区分大小写的条件
【讨论】:
如果你真的想使用正则表达式,你可以使用positive lookahead操作符:
(?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
【讨论】:
我通常使用this applet 来试验 reg。前任。表达式可能如下所示:
if (str.matches("(?i)^.*?(WARNING|ERROR).*?parsing.*$")) {
...
但如上述答案所述,最好不要使用 reg.前任。在这里。
【讨论】:
我认为这个正则表达式可以解决问题(但必须有更好的方法):
(.*(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 模式的开头或中间使用 .*。
【讨论】: