Разделить строку с несколькими разделителями строк - PullRequest
0 голосов
/ 01 мая 2020

Как разделить список фильтров на отдельные элементы фильтра? Результатом split2String является: Исключение в потоке "main" 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]);
        }
    }
)

Ответы [ 2 ]

0 голосов
/ 01 мая 2020

"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 \\(")

, что дает:

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

Таким образом, правильное регулярное выражение выглядит следующим образом : "OR \\(|AND \\("

0 голосов
/ 01 мая 2020

вы можете использовать следующее регулярное выражение для извлечения информации. Поскольку все, что вам нужно, содержится в скобках.

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));
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...