Почему это не жадное регулярное выражение захватывает больше, чем я хочу?

Я думаю, что это должно вернуть "государство, страна", но это возвращает "страну"

System.out.println("city,state,country".replaceAll("(.*,)?", ""));

Почему это работает таким образом, и как мне заставить его вернуть "государство, страна". Я хочу этот ответ в качестве регулярного выражения.

5 ответов

Решение

Как следует из названия, replaceAll заменяет все соответствующие группы. Вы должны быть более конкретными, где группа соответствует. Чтобы указать первую подходящую группу, вы можете указать начало String^ как якорь:

"city,state,country".replaceAll("^(.*?,)", "")
  1. если вы хотите сделать .* чтобы не быть жадным, нужно добавить ? сразу после *,
  2. replaceAll заменит все совпадения частей, так что вы, вероятно, должны использовать replaceFirst

пытаться

System.out.println("city,state,country".replaceFirst(".*?,", ""));

выход:

state,country

Если вы не можете использовать replaceFirst и нужно остаться с replaceAll тогда @Reimeus ответ, вероятно, то, что вы ищете.

Вы захватываете любую группу, заканчивающуюся запятой, а не только одну, и поэтому она в настоящее время не работает.

System.out.println("city,state,country".replaceAll("^[^,]*+,", ""));

? Нежадный флаг можно использовать только после + или *, в вашем контексте это совпадение 0 или-1.

Ты хочешь

System.out.println("city,state,country".replaceAll("(.*?,)", ""));

Попробуйте с этим выражением:

^(.*?,)

или вот так:

System.out.println("city,state,country".replaceAll("(.*?,)((?:.*?,)+)", "$2"));
Другие вопросы по тегам