У меня есть регулярное выражение с обязательной частью, нежадной (ленивой?) Частью, необязательной частью и, наконец, еще одной не жадной частью.
<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.
-
Об этом спрашивали до , но ни для одного из нас не было удовлетворительного ответа.