Сопоставление Java с обеих сторон квантификатора
Я хотел бы написать регулярное выражение в Java, который найдет самое короткое из доступных совпадений с обеих сторон квантификатора.
Например, для этого шаблона "a.*?b"
применяется к "aaaaaacbbbbbbb"
:
я хотел бы найти "acb"
но я получаю "aaaaaacb"
,
У кого-нибудь есть идея, какое регулярное выражение я могу использовать для этого?
2 ответа
Вы можете имитировать неохотное соответствие с самого начала, отбрасывая жадных .*
, В этом случае это станет .*(a.*?b)
, если вы получите группу № 1:
String example = "aaaaaacbbbbbbb";
Matcher m = Pattern.compile(".*(a.*?b)").matcher(example);
m.find();
System.out.println(m.group(1));
Вы хотите самую короткую последовательность, которая начинается с 'a'
и заканчивается 'b'
, Это означает, что между начальным 'a'
и финал 'b'´, neither an
"А"nor a
может появиться 'b'` (иначе такая последовательность будет короче, чем в матче), таким образом
"a[^ab]*b"
найдет минимальную такую последовательность (первое, встречающееся в искомой строке, или все такое, в зависимости от того, как вы ищете).
Я не сообразительный с синтаксисом ленивого или жадного сопоставления, я думаю
"a[^a]*?b"
будет делать то же самое, соответствовать 'a'
минимальная последовательность'a'
до следующего 'b'
найден.