Расщепление строки в java с разными разделителями - PullRequest
1 голос
/ 01 мая 2020

Я пытаюсь разделить следующее в список.

 "[A,B], [C,D]";

Мне нужно, чтобы вывод:

[A,B]
[C,D]

Я попробовал следующее, но я получаю вывод как:

[A,B
[C,D]

Код:

ArrayList   result = new ArrayList(Arrays.asList(inp.split("\\],")));

Спасибо.

Ответы [ 3 ]

1 голос
/ 01 мая 2020

Использование

inp.split(",\\s*(?![^\\[]*\\])")

См. регулярное выражение . Он будет соответствовать запятой и любому пробелу после, если после этого нет символов, отличных от [, а затем ].

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

Если вам нужен формат этих данных, вы можете использовать якорь \G для получения итеративных совпадений.

Затем вы можете l oop совпадений и добавить группу захвата 1 в список.

\G(\[[A-Z],[A-Z]])(?:,\h*)?

По частям:

  • \G Утверждение позиции в конце предыдущего матча или в начале строки
  • ( Захват группа 1
    • \[[A-Z],[A-Z]]
  • ) Закрыть группу 1
  • (?:,\h*)? По выбору совпадать , и 0+ горизонтальных пробельных символов

Regex demo | Java демо

Пример кода

String regex = "\\G(\\[[A-Z],[A-Z]])(?:,\\h*)?";
String string = "[A,B], [C,D]";

Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(string);

List<String> result = new ArrayList<String>();

while (matcher.find()) {
    result.add(matcher.group(1));
}

for (String element : result)
    System.out.println(element);

Выход

[A,B]
[C,D]
0 голосов
/ 01 мая 2020

Вы можете использовать ,\s*(?=\[), что означает

  • , запятую
  • \s*, за которой следует любое количество пробела (включая 0)
  • (?=\[), за которым непосредственно следует открывающая квадратная скобка (но
ArrayList<String> result = new ArrayList<>(Arrays.asList(inp.split(",\\s*(?=\\[)")));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...