Java лучший способ найти и заменить строку? - PullRequest
28 голосов
/ 12 января 2010

Я ищу лучший подход для поиска и замены строк в Java.

Это предложение: «Меня зовут Милан, меня знают как Милана Васича».

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

после поиска / замены должен быть результат: «Меня зовут Милан Васич, меня знают как Милана Васича».

Я пытался использовать indexOf (), а также комбинацию Pattern / Matcher, но ни один из моих результатов не выглядит элегантно, у кого-то есть элегантное решение?

ура!

Ответы [ 7 ]

44 голосов
/ 12 января 2010

Ну, вы можете использовать регулярное выражение , чтобы найти случаи, когда за "Миланом" не следует "Васич":

Milan(?! Vasic)

и замените его на полное имя:

String.replaceAll("Milan(?! Vasic)", "Milan Vasic")

Часть (?!...) является отрицательным прогнозом , который гарантирует, что при любых совпадениях не будет следовать части в скобках. Он не потребляет никаких символов в самом матче.

В качестве альтернативы, вы можете просто вставить (ну, технически заменив совпадение с нулевой шириной) фамилию после имени, если за ней уже не следует фамилия. Это выглядит аналогично, но также использует позитивный взгляд за :

(?<=Milan)(?! Vasic)

Вы можете заменить это просто " Vasic" (обратите внимание на пробел в начале строки):

String.replaceAll("(?<=Milan)(?! Vasic)", " Vasic")

Вы можете попробовать эти вещи здесь например.

23 голосов
/ 12 января 2010

Другой вариант:

"My name is Milan, people know me as Milan Vasic"
    .replaceAll("Milan Vasic|Milan", "Milan Vasic"))
8 голосов
/ 12 января 2010

Одна возможность, сократить более длинную форму, прежде чем развернуть все:

string.replaceAll("Milan Vasic", "Milan").replaceAll("Milan", "Milan Vasic")

Другой способ, трактующий Vasic как необязательный:

string.replaceAll("Milan( Vasic)?", "Milan Vasic")

Другие описали решения на основе lookahead или чередования .

4 голосов
/ 12 января 2010

Если вы не хотите помещать свою руку в регулярное выражение (возможно, вам следует), вы можете сначала заменить всю строку "Milan Vasic" на "Milan".

И чем заменить все строки "Milan" на "Milan Vasic".

3 голосов
/ 12 января 2010

Попробуйте это:

public static void main(String[] args) {
    String str = "My name is Milan, people know me as Milan Vasic.";

    Pattern p = Pattern.compile("(Milan)(?! Vasic)");
    Matcher m = p.matcher(str);

    StringBuffer sb = new StringBuffer();

    while(m.find()) {
        m.appendReplacement(sb, "Milan Vasic");
    }

    m.appendTail(sb);
    System.out.println(sb);
}
3 голосов
/ 12 января 2010

Просто включите JAR Apache Commons Lang и используйте класс org.apache.commons.lang.StringUtils. Вы заметите множество способов безопасной и эффективной замены строк.

Вы можете просмотреть API StringUtils на ранее связанном веб-сайте.

"Не изобретай велосипед"

1 голос
/ 12 января 2010

Вы также можете использовать шаблон соответствия, который заменит все в одном кадре.

Pattern keyPattern = Pattern.compile (ключ); Matcher matcher = keyPattern.matcher (str); String nerSrting = matcher.replaceAll (значение);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...