【问题标题】:How to find if a Java String contains X or Y and contains Z如何查找Java字符串是否包含X或Y并包含Z
【发布时间】:2010-11-29 02:25:19
【问题描述】:

我很确定正则表达式是要走的路,但每当我试图计算出特定的正则表达式时,我的头就会很痛。

如果 Java 字符串(包含文本“ERROR”或文本“WARNING”)和(包含文本“解析”),其中所有匹配项都不区分大小写,我需要查找什么正则表达式?

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

【问题讨论】:

    标签: java regex string


    【解决方案1】:

    如果您对正则表达式不是 100% 满意,请不要尝试将它们用于此类事情。只需这样做:

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

    因为当您在六个月后回到您的代码时,您会一眼就明白。

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

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

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

    【讨论】:

    • 里奇,你是对的。不过,我给出了一个具体案例,让问题更容易理解,但我的问题更笼统。
    • s.contains("error") 或 s.contains("warning") 实际上应该是 s.contains("error") || s.contains("warning"),不是吗?
    【解决方案2】:

    尝试:

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

    【讨论】:

      【解决方案3】:

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

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

      这也考虑了不区分大小写的条件

      【讨论】:

        【解决方案4】:

        如果你真的想使用正则表达式,你可以使用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
        

        【讨论】:

        • System.out.println("matches = " + Pattern.matches("(?=.*?(?:ERROR|WARNING))(?=.*?parsing)", "ERROR你好解析世界"));返回 false... 那里出了点问题。
        【解决方案5】:

        我通常使用this applet 来试验 reg。前任。表达式可能如下所示:

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

        但如上述答案所述,最好不要使用 reg.前任。在这里。

        【讨论】:

        • System.out.println(Pattern.compile("(?i)^.*?(WARNING|ERROR).*?parsing.*$").matcher("解析错误 Hello world" )。火柴());返回错误...
        【解决方案6】:

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

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

        【讨论】:

          【解决方案7】:

          如果您想要匹配的单词数量不定,我会这样做:

          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 :(");
          }
          

          注意:我没有编译这段代码,所以可能包含拼写错误。

          【讨论】:

            【解决方案8】:

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

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

            【讨论】:

              猜你喜欢
              • 2018-09-06
              • 2020-11-20
              • 2020-09-01
              • 2013-06-05
              • 2011-01-10
              • 1970-01-01
              • 1970-01-01
              • 2019-04-22
              • 2015-12-29
              相关资源
              最近更新 更多