简体   繁体   English

使用多个字符串分隔符拆分字符串

[英]Split String with multiple String Delimiter

How can I split the Filterlist in single Filter Elements?如何将过滤器列表拆分为单个过滤器元素? split2String results in an: Exception in thread "main" java.util.regex.PatternSyntaxException: Unclosed group near index 10 OR (|AND ( split2String 导致:线程“主”java.util.regex.PatternSyntaxException 中的异常:索引 10 附近的未封闭组 OR (|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]);
        }
    }

you can use the following regex to extract information.您可以使用以下正则表达式来提取信息。 As all you need is contained within parenthesis.因为您需要的所有内容都包含在括号中。

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));
  }
}

"OR (|AND (" this regex has an incorrect syntax. Round bracket character ( has a special meaning in regex. It marks the begging of capturing group . Since it is a special character, it must be escaped by adding \\ : "OR (|AND ("这个正则表达式语法不正确。圆括号字符(在正则表达式中有特殊含义。它标志着捕获组的乞求。由于是特殊字符,必须通过添加\\来进行转义

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

this gives:这给出了:

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

So the correct regex looks like: "OR \\(|AND \\("所以正确的正则表达式看起来像: "OR \\(|AND \\("

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM