Причина, по которой вы не получаете дополнительный cat
после того, как неохотно квалифицированные .+?
, что она является необязательной и не закреплено: двигатель не было вынужден сделать этот матч, потому что он может законно лечить cat
как «хвост» последовательности .+?
.
Если йо якорь кошку в конце строки, то есть использовать ^(dog).+?(cat)?$
, вы получите матч, хотя:
Pattern p = Pattern.compile("^(dog).+?(cat)?$");
for (String s : new String[] {"dog, cat", "dog, dog, cat", "dog, dog, dog"}) {
Matcher m = p.matcher(s);
if (m.find()) {
System.out.println(m.group(1)+" "+m.group(2));
}
}
Печатает (demo 1)
dog cat
dog cat
dog null
Do вы знаете, как с этим справиться, если есть что-то после кошки?
Вы можете иметь дело с ним, построив хитрее выражение, которое соответствует ничего, кроме cat
, как это:
^(dog)(?:[^c]|c[^a]|ca[^t])+(cat)?
Теперь cat
может произойти в любом месте строки без анкера (demo 2).
Спасибо. Вы случайно не знаете, как с этим справиться, если есть что-то после кошки? Например: «собака, собака, кошка, бла». Я хочу захватить только первую собаку и дополнительную кошку (может быть не больше одной кошки). – forsajt
хотел бы увидеть этот ответ –