Regex для разделения строки в Java с вложенными скобками - PullRequest
0 голосов
/ 07 ноября 2019

Я пытался разделить ядро ​​и добавить его в массив строк.

String str1 = "1, two, {three,4,5,{six,7}}, 8, nine,{[ten,{\"11\":\"12\"},{\"thirteen\":14}]},\"fifteen\",16";

Требуемый вывод в массиве:

1
two
{three,4,5,{six,7}}
8
nine
{[ten,{"11":"12"},{"thirteen":14}]}
fifteen
16

Нам нужно разделить это сфункция разделения в Java с использованием регулярных выражений. Кто-нибудь может предложить регулярное выражение для получения этого вывода?

Ответы [ 3 ]

1 голос
/ 07 ноября 2019

Регулярное выражение - это не тот инструмент, который вам нужен.

Вы можете попробовать что-то вроде этого:

public static String[] split(String s) {
    List<String> result = new ArrayList<>();
    StringBuilder buf = new StringBuilder();
    int level = 0;
    boolean inQuotes = false;
    for (char c: s.toCharArray()) {
        switch (c) {
            case ' ':
                if (buf.length() > 0) {
                    buf.append(c);
                }
                break;
            case ',':
                if (level == 0 && !inQuotes) {
                    result.add(buf.toString());
                    buf.setLength(0);
                } else {
                    buf.append(c);
                }
                break;
            case '"':
                buf.append(c);
                inQuotes = !inQuotes;
                break;
            case '[':
            case '{':
                buf.append(c);
                if (!inQuotes) {
                    ++level;
                }
                break;
            case ']':
            case '}':
                buf.append(c);
                if (!inQuotes) {
                    --level;
                }
                break;
            default:
                buf.append(c);
                break;
        }
    }
    if (inQuotes || level > 0) {
        throw new IllegalArgumentException("Syntax error");
    }
    result.add(buf.toString());
    return result.toArray(new String[result.size()]);
}

Но это не избавит от кавычек (Кстати: я неузнать, как должны обрабатываться кавычки):

1
two
{[three,4,5,{six,7}]}
8
nine
{[ten,{"11":"12"},{"thirteen":14}]}
"fifteen"
16
1 голос
/ 07 ноября 2019

Если ваш текст не меняет свою структуру, вы можете написать регулярное выражение специально для этой цели. Вещи, которые я бы сделал с этим:

  • Ударь человека, который посылает тебе этот вывод
  • Убеди его отправлять его лучше и разделить каждую логическую часть запятой и пробелом
  • Теперь вы можете использовать регулярное выражение ,\s, чтобы разбить вашу строку
0 голосов
/ 07 ноября 2019

Вы можете использовать следующее регулярное выражение для этого -> ,(?![^\\[]*\\])

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

public static void main(String[] args) {
        String str1 = "1, two, {[three,4,5,{six,7}]}, 8, nine,{[ten,{\"11\":\"12\"},{\"thirteen\":14}]},\"fifteen\",16";
        String[] stringParts = str1.split(",(?![^\\[]*\\])");

        for (int i=0; i<stringParts.length; i++){
            stringParts[i] = stringParts[i].trim();//remove trailing leading spaces.
        }
        //System out
        for (String s:stringParts){
            System.out.println(s);
        }
    }

Вывод:

1
two
{[three,4,5,{six,7}]}
8
nine
{[ten,{"11":"12"},{"thirteen":14}]}
"fifteen"
16
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...