String.split (pattern) генерирует исключение из-за {in pattern: java.util.regex.PatternSyntaxException - PullRequest
1 голос
/ 07 марта 2012

У меня есть строка в Java.Вот часть того, что меня интересует {3: {108:TR2011052300088}}

Позже я делю сплит на {3: {108:.По какой-то причине (я гуглил) { и } - специальный символ, поэтому его необходимо экранировать \} и \{ (ясно, что это не работает -> ошибка времени компиляции).

Другие упоминают, что это ошибка в регулярном выражении Java.Я действительно не уверен.Исключение, которое я получаю:

Exception in thread "main" java.util.regex.PatternSyntaxException: Unclosed counted closure near index 2 {3:{108: at java.util.regex.Pattern.error(Unknown Source)

Короче говоря, мой код разбивает строку, используя {3: {108: в качестве разделителя, и вылетает на ней:

String query="{3: {108:";
String [] messageParts = message.split(query);

Мне известны другие способы сделать это, хотя и более сложные, например, написать собственный синтаксический анализатор и т. Д.

Как я могу разбить строку, чтобы она не вылетала?

РЕДАКТИРОВАТЬ: Чтобы ответить на некоторые комментарии:
- Двойная косая черта не помогает: \\{ дать \{3:\{108:MAMABEARid123}}, так как 2 косые черты становятся 1
-Экранирование с 1 косой чертой не скомпилируется: неверная последовательность Escape

Ответы [ 4 ]

6 голосов
/ 07 марта 2012

Пример выхода из {:

    public static void main(String[] args) {
        String s = "{3: {108:TR2011052300088}}";
        String[] ss  = s.split("\\{3: \\{108:");
        System.out.println(ss[1]); //prints TR2011052300088}}
    }
0 голосов
/ 06 декабря 2013

Использовать [{] ..... Я работал с Regex для сообщений Swift до

0 голосов
/ 07 марта 2012

Снять фигурные скобки и разделить их на двоеточие:

String inp = "{3: {108:TR2011052300088}}";

System.out.println(inp.replaceAll("[\\{\\}]", "").split(":")[2])

Отпечатки 'TR2011052300088'

0 голосов
/ 07 марта 2012

Если вы действительно не нуждаетесь в регулярных выражениях, я бы использовал Гуава х Splitter класс.

private static final Splitter SPLITTER = Splitter.on("{3: {108:");

...

Iterable<String> bits = SPLITTER.split(messageParts);

(Вы можете использовать Iterables.toArray для создания массива из этого или Lists.newArrayList для списка, или что-то еще ...)

...