У меня есть регулярное выражение с обязательной частью, нежадной (ленивой?) частью, необязательной частью и, наконец, еще одной нежадной частью.
<mandatory><non-greedy><optional><non-greedy>
Реализовано как:^mandatory.*?(:?optionalpart)?.*?$
Необязательная часть состоит из «фигуры, которую нужно найти» и «фигуры, которую нужно вернуть в группе захвата».
^mandatory.*?(:?findme(matchme))?.*?$
Но для некоторых входных данных первая нежадная часть использует символы, которым должна соответствовать следующая необязательная часть. Есть ли способ сделать необязательную часть более жадной, чем предыдущая не жадная часть?
Пример: найти символ после 2,
или найти пустую строку, если 2,
нет, но обязательная часть совпадает.
"Foo: 2,b,1,a,3,c" -> match, $1 = "b"
"Foo: 1,a,2,b,3,c" -> match, $1 = "b"
"Foo: 1,a,3,c,2,b" -> match, $1 = "b"
"Foo: 2,b" -> match, $1 = "b"
"Foo: 1,a,3,c" -> match, $1 = ""
"Fuu: 1,a,2,b,3,c" -> no match.
Попытка 1: ^Foo: .*?(?:2,([a-z]))?.*?$
Во 2-м и 3-м примерах происходит сбой, возвращается ""
вместо "2"
.
Попытка 2: ^Foo: .*?(?:2,([a-z])).*?$
Это исправляет предыдущий сбой, но теперь сбой в 5-м примере не соответствует.
Часть, которая должна быть необязательной, больше не является необязательной.
Если это имеет значение, я использую класс Pattern Java.
--
Об этом задавали раньше, но не было удовлетворительного ответа на любой из нас.