замените группу фиксации

Если у меня есть regex с группой фиксации, например. foo(_+f). Если я соответствую этому против строки и хочу заменить первую группу фиксации во всех соответствиях с baz так, чтобы

foo___f blah foo________f

преобразовывается в:

foobaz blah foobaz

Кажется, нет никакого простого способа сделать это пользующееся стандартными библиотеками. Если я буду использовать Matcher.replaceAll (), то это заменит все соответствия всего шаблона и преобразует строку в

baz blah baz

Очевидно, я могу просто выполнить итерации через соответствия, сохранить запуск и закончить индекс каждой группы фиксации, затем возвратитесь и замените их, но существует ли более легкий путь?

Спасибо, Дон

11
задан Dónal 27 May 2010 в 13:02
поделиться

3 ответа

Я думаю, вам нужно что-то вроде этого?

    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 .

25
ответ дан 3 December 2019 в 02:52
поделиться
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
1
ответ дан 3 December 2019 в 02:52
поделиться

Это где-нибудь близко ....

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")
0
ответ дан 3 December 2019 в 02:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: