Почему это не жадное регулярное выражение захватывает больше, чем я хочу?
Я думаю, что это должно вернуть "государство, страна", но это возвращает "страну"
System.out.println("city,state,country".replaceAll("(.*,)?", ""));
Почему это работает таким образом, и как мне заставить его вернуть "государство, страна". Я хочу этот ответ в качестве регулярного выражения.
5 ответов
Как следует из названия, replaceAll
заменяет все соответствующие группы. Вы должны быть более конкретными, где группа соответствует. Чтобы указать первую подходящую группу, вы можете указать начало String
^
как якорь:
"city,state,country".replaceAll("^(.*?,)", "")
- если вы хотите сделать
.*
чтобы не быть жадным, нужно добавить?
сразу после*
, 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"));