Подтвердить что ты не робот

Java лучший способ для поиска и замены строк?

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

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

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

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

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

ура!

4b9b3361

Ответ 1

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

Milan(?! Vasic)

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

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

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

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

(?<=Milan)(?! Vasic)

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

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

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

Ответ 2

Другая опция:

"My name is Milan, people know me as Milan Vasic"
    .replaceAll("Milan Vasic|Milan", "Milan Vasic"))

Ответ 3

Одна возможность, уменьшая длинную форму перед расширением всего:

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

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

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

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

Ответ 4

Если вы не хотите использовать регулярное выражение вашей руки (возможно, вам следует), вы можете сначала заменить всю миланскую "Мицубиси" на "Милан".

И чем заменить все "Миланские" струны "Миланом Васиком".

Ответ 5

Попробуйте следующее:

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);
}

Ответ 6

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

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

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

Ответ 7

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

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