Я пытаюсь написать регулярное выражение, которое разделяет элементы в соответствии с разделителем. Регулярное выражение также должно гарантировать, что в идеале должно быть 4, но не менее 3 двоеточий :
в каждом совпадении.
Вот пример строки:
"Checkers, etc:Blue::C, Backgammon, I say:Green::Pepsi:P, Chess, misc:White:Coke:Florida:A, :::U"
Отсюда должно быть 4совпадения:
Checkers, etc:Blue::C
Backgammon, I say:Green::Pepsi:P
Chess, misc:White:Coke:Florida:A
:::U
Вот что я попробовал до сих пор:
([^:]*:[^:]*){3,4}(?:, )
Regex 101 at: https://regex101.com/r/O8iacP/8
Я попытался создать группу без захвата для ,
Затем я попытался сопоставить группу любому символу, который не является :
, :
, и любому символу, который не :
3 или 4 раза.
Код, который я использую для итерацииэти группы:
String line = "Checkers, etc:Blue::C, Backgammon, I say::Pepsi:P, Chess:White:Coke:Florida:A, :::U";
String pattern = "([^:]*:[^:]*){3,4}(?:, )";
// Create a Pattern object
Pattern r = Pattern.compile(pattern);
// Now create matcher object.
Matcher matcher = r.matcher(line);
while (matcher.find()) {
System.out.println(matcher.group(1));
}
Любая помощь приветствуется!
Редактировать
Используя регулярное выражение @ Casimir, все работает. Мне пришлось изменить приведенный выше код, чтобы использовать группу (0) следующим образом:
String line = "Checkers, etc:Blue::C, Backgammon, I say::Pepsi:P, Chess:White:Coke:Florida:A, :::U";
String pattern = "(?![\\s,])(?:[^:]*:){3}\\S*(?![^,])";
// Create a Pattern object
Pattern r = Pattern.compile(pattern);
// Now create matcher object.
Matcher matcher = r.matcher(line);
while (matcher.find()) {
System.out.println(matcher.group(0));
}
Теперь печатает:
Checkers, etc:Blue::C
Backgammon, I say::Pepsi:P
Chess:White:Coke:Florida:A
:::U
Еще раз спасибо!