регулярные выражения. Как разделить строку?
Есть список названий городов через запятую, а также список синонимов названий в квадратных скобках. пример - Москва [Мск, Белокаменная], Санкт-Петербург [Спб, Питер], Ростов, Калининград Нужно поделить на списки из названий
- Москва [Мск, Белокаменная]
- Санкт-Петербург [Спб, Питер]
- Ростов
- Калининград
Разделить все названия просто
String input = "Москва [Мск, Белокаменная], Санкт-Петербург [Спб, Питер], Ростов";
Pattern pattern = Pattern.compile("[\[,\]]");
String[] words = pattern.split(input);
А как вытянуть названия вместе с синонимами в квадратных скобках?
Ответы (3 шт):
Попробуйте matcher. Предполагается, что в названии города не может быть только открывающей квадратной скобки и запятой, зато пробелы могут быть. (?!\s) в начале срезает ненужные пробелы слева. Ссылка на регулярное выражение — https://www.regexplanet.com/share/index.html?share=yyyyd0tvj6r:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
String input = "Москва [Мск, Белокаменная], Санкт-Петербург [Спб, Питер], Ростов";
List<String> cities = new ArrayList<String>();
Pattern pattern = Pattern.compile("(?!\s)[^\[,]+(\s*\[.+?\])?");
Matcher matcher = pattern.matcher(input);
String[] words = pattern.split(input);
while (matcher.find()) {
cities.add(m.group());
}
Попробуйте такой вариант регулярки ,(?<=\],) ? тест на regex101
String input = "Москва [Мск, Белокаменная], Санкт-Петербург [Спб, Питер], Ростов";
String[] words = input.split(",(?<=\\],) ?");
Результат 3 элемента тест на onecompiler
Москва [Мск, Белокаменная]
Санкт-Петербург [Спб, Питер]
Ростов
Зачем вам регулярные выражения, если задача решается простым линейным парсингом?
String input = "Москва [Мск, Белокаменная], Санкт-Петербург [Спб, Питер], Ростов";
List<String> words = new LinkedList<>();
int square = 0;
int start = 0;
for (int i = 0; i < input.length(); i++) {
switch (input.charAt(i)) {
case '[': square++; break;
case ']': square--; break;
case ',':
if (square == 0) {
words.add(input.substring(start, i).trim());
start = i + 1;
}
break;
}
}
if (start < input.length())
words.add(input.substring(start).trim());