Сопоставление 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' найден.

Другие вопросы по тегам