Альтернатива (?|) для Java

final String regex = "(?|\"([^\"]+)\"|(\\S+))";

На такую регулярку машина выдаёт

Exception in thread "main" java.util.regex.PatternSyntaxException: Unknown inline modifier near index 2
(?|"([^"]+)"|(\S+))

Есть ли альтернатива данной конструкции?


Ответы (1 шт):

Автор решения: Wiktor Stribiżew

В регулярных выражениях Java группы со сбросом индексов захватывающих групп (branch reset group) не поддерживаются.

Используйте "\"([^\"]+)\"|(\\S+)" и берите совпадения из подмасок, если значение подмаски не равно null:

String s = "\"abc\" def \"ghi jkl\"";
Pattern pattern = Pattern.compile("\"([^\"]+)\"|(\\S+)");
Matcher matcher = pattern.matcher(s);
List<String> results = new ArrayList<>();
while (matcher.find()){
    if (matcher.group(1) != null) {
        results.add(matcher.group(1));
    } else {
        results.add(matcher.group());
    }
} 
System.out.println(results); // => [abc, def, ghi jkl]

См. пример работы кода на Java.

→ Ссылка