Java String.replaceFirst (), который принимает аргумент «начиная с» - PullRequest
6 голосов
/ 25 февраля 2010

Мне нужно заменить слово в строке, похожее на "дух, что-то еще, дух". Мне нужно только заменить второе «дух», но первое и последнее должны остаться нетронутыми, так что replace () и replaceFirst () не работают. Есть ли такой метод, как replaceFirst (регулярное выражение строки, замена строки, смещение int), который заменит первое возникновение замены, начиная со смещения, или, возможно, вы порекомендуете другой способ решения этой проблемы? Спасибо! * * 1001

Ответы [ 3 ]

9 голосов
/ 25 февраля 2010

Что-то вроде этого:

String replaceFirstFrom(String str, int from, String regex, String replacement)
{
    String prefix = str.substring(0, from);
    String rest = str.substring(from);
    rest = rest.replaceFirst(regex, replacement);
    return prefix+rest;
}

// or
s.substring(0,start) +  s.substring(start).replaceFirst(search, replace);

только 1 строка кода ... не целый метод.

4 голосов
/ 25 февраля 2010

Будет ли что-то подобное работать?

  System.out.println(
     "1 duh 2 duh duh 3 duh"
     .replaceFirst("(duh.*?)duh", "$1bleh")
  ); // prints "1 duh 2 bleh duh 3 duh"

Если вы просто хотите заменить второе вхождение шаблона в строке, вам действительно не нужно это вычисление индекса «начиная с».

В качестве бонуса, если вы хотите заменить все остальные duh (то есть второй, четвертый, шестой и т. Д.), Тогда просто вызовите replaceAll вместо replaceFirst.

2 голосов
/ 25 февраля 2010

Альтернативное использование Matcher :

 String input = "duh duh something else duh";
 Pattern p = Pattern.compile("duh");
 Matcher m = p.matcher(input);
 int startIndex = 4;

 String output;

 if (m.find(startIndex)) {
     StringBuffer sb = new StringBuffer();
     m.appendReplacement(sb, "dog");
     m.appendTail(sb);
     output = sb.toString();
 } else {
     output = input;
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...