【问题标题】:Split String with multiple String Delimiter使用多个字符串分隔符拆分字符串
【发布时间】:2020-05-01 19:22:10
【问题描述】:

如何将过滤器列表拆分为单个过滤器元素? split2String 导致: 线程“主”java.util.regex.PatternSyntaxException 中的异常:索引 10 附近的未关闭组 或 (|AND (

public class TestIt {

    public static void main(String[] args) {
        // condition is Part of the Thunderbird Filter List
        String condition1 = "OR (subject,contains,Xxxx Yyyy) OR (subject,contains,Uuuu Cccc) AND (from,contains,Wwwww Zzzzz) OR (subject,contains,Uuuu Cccc)";
        String condition2 = "OR (subject,contains,Xxxx YyOR yy) OR (subject,contains,Uuuu CcAND cc) AND (from,contains,Wwwww Zzzzz) OR (subject,contains,Uuuu Cccc)";
        split1String(condition1);
        split1String(condition2);
        split2String(condition1);
        split2String(condition2);
        /*
         * Expected Result with condition2:
         * (subject,contains,Xxxx YyOR yy)
         * (subject,contains,Uuuu CcAND cc)
         * (from,contains,Wwwww Zzzzz)
         * (subject,contains,Uuuu Cccc)
         * 
         */
    }

    public static void split1String(String condition) {
        // Syntax=OK Result wrong
        String[] xsplitted = condition.split("OR |AND ");
        for (int i = 0; i < xsplitted.length; i++) {
            System.out.println(xsplitted[i]);
        }
    }

    public static void split2String(String condition) {
        // Syntax=NOT OK 
        String[] xsplitted = condition.split("OR (|AND (");
        for (int i = 0; i < xsplitted.length; i++) {
            System.out.println(xsplitted[i]);
        }
    }

【问题讨论】:

    标签: java


    【解决方案1】:

    "OR (|AND (" 这个正则表达式的语法不正确。圆括号字符( 在正则表达式中具有特殊含义。它标志着capturing group的乞讨。既然是特殊字符,那一定是escaped加上\\

    "OR (subject,contains,Xxxx Yyyy) OR (subject,contains,Uuuu Cccc) AND (from,contains,Wwwww Zzzzz) OR (subject,contains,Uuuu Cccc)".split("OR \\(|AND \\(")
    

    这给出了:

     String[5] { "", "subject,contains,Xxxx Yyyy) ", "subject,contains,Uuuu Cccc) ", "from,contains,Wwwww Zzzzz) ", "subject,contains,Uuuu Cccc)" }
    

    所以正确的正则表达式看起来像:"OR \\(|AND \\("

    【讨论】:

      【解决方案2】:

      您可以使用以下正则表达式来提取信息。因为您需要的所有内容都包含在括号中。

      Pattern pattern = Pattern.compile("\\((.*?)\\)", Pattern.MULTILINE);
      
      Matcher matcher = pattern.matcher(condition2);
      
      while (matcher.find()) {
        for (int i = 1; i <= matcher.groupCount(); i++) {
          System.out.println(matcher.group(i));
        }
      }
      

      【讨论】:

      • @MartinKehrholff 这也适用于这两种情况。
      猜你喜欢
      • 2018-02-27
      • 2011-12-26
      • 1970-01-01
      • 2012-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多