Если у меня есть regex с группой фиксации, например. foo(_+f)
. Если я соответствую этому против строки и хочу заменить первую группу фиксации во всех соответствиях с baz
так, чтобы
foo___f blah foo________f
преобразовывается в:
foobaz blah foobaz
Кажется, нет никакого простого способа сделать это пользующееся стандартными библиотеками. Если я буду использовать Matcher.replaceAll (), то это заменит все соответствия всего шаблона и преобразует строку в
baz blah baz
Очевидно, я могу просто выполнить итерации через соответствия, сохранить запуск и закончить индекс каждой группы фиксации, затем возвратитесь и замените их, но существует ли более легкий путь?
Спасибо, Дон
Я думаю, вам нужно что-то вроде этого?
System.out.println(
"foo__f blah foo___f boo___f".replaceAll("(?<=foo)_+f", "baz")
); // prints "foobaz blah foobaz boo___f"
Здесь вы просто заменяете все совпадение на "baz"
, но при совпадении используется ретроспективный просмотр, чтобы гарантировать, что _ + f
будет предшествует foo
.
Если поиск назад невозможен (возможно, потому, что длина не конечна), просто запишите даже то, что вы НЕ заменяете, и обратитесь к ним обратно в строка замены.
System.out.println(
"fooooo_f boooo_f xxx_f".replaceAll("(fo+|bo+)(_+f)", "$1baz")
); // prints "fooooobaz boooobaz xxx_f"
Таким образом, здесь мы фактически заменяем только то, что соответствует \ 2
.
p = Pattern.compile("foo(g.*?f)");
m = p.matcher("foog___f blah foog________f");
s = m.replaceAll("foobaz");//replace with foobaz instead of just baz
System.out.println(s);//foobaz blah foobaz
Это где-нибудь близко ....
String[] s = {"foo___f blah foo________f",
"foo___f blah goo________f"};
for(String ss: s)
System.out.println(ss.replaceAll("(foo)(_+)f", "$1baz"));
То есть, добавьте также группу захвата для 'foo'. В противном случае простая замена была бы
"foo___f blah foo________f".replaceAll("(_+)f", "baz")