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

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

Это - предложение: "Меня зовут Milan люди знают меня как Milan Vasic".

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

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

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

За Ваше здоровье!

29
задан vaske 12 January 2010 в 14:18
поделиться

7 ответов

Википедия имеет хорошую статью об этом , и официальная спецификация здесь . От Wikipdia:

Локальная часть адреса электронной почты может использовать любой из этих символов ASCII:

  • Прописные и строчные английские буквы (a-z, A-Z)
  • Цифры от 0 до 9
  • Символы! # $% & '* + -/=? ^ _' {|} ~
  • Символ. (точка, период, полная остановка) при условии, что он не является первым или последним символом, а также при условии, что он не появляется два или более раз последовательно.

Кроме того, допускаются строки в кавычках (т.е. «John Doe» @ example.com), что позволяет использовать символы, которые в противном случае были бы запрещены, однако они не встречаются в обычной практике. RFC 5321 также предупреждает, что «узел, который ожидает получать почту, ДОЛЖЕН избегать определения почтовых ящиков, где локальная часть требует (или использует) форму Строка в кавычках».

-121--1788525-

Я создаю интранет в своей компании.

Мне интересно понять, как загружать данные, которые хранились в таблицах (Oracle, MySQL, SQL Server, Excel, Access, различные случайные списки), и загрузить их в Neo4J или какую-либо другую графическую базу данных. В частности, что происходит, когда общие данные перекрывают существующие данные, уже имеющиеся в системе.

Да, я знаю, что некоторые данные лучше всего смоделировать в RDBMS, но я имею эту идею зуда меня, что, когда вам нужно наложить несколько различных таблиц, модель графа лучше, чем структура таблицы.

Например, я работаю в производственной среде. Существует крупный проект, над которым мы работаем, и из-за сложности каждый отдел создал отдельную электронную таблицу Excel, которая имеет иерархию BOM (спецификация) в столбце слева, а затем несколько столбцов заметок и чеков, сделанных лицами, которые сделали эти листы.

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

Вторая проблема заключается в том, что электронная таблица Excel поглощает представление иерархической ведомости материалов, когда общий компонент используется в нескольких подсборках. Это означает, что если кто-то пишет заметку о реле P34 в узле зажигания, то тот же комментарий должен быть связан с реле P34, используемыми в узле привода двигателя. Это не произойдет в таблице Excel.

Для интрасети компании я хочу иметь возможность легко искать что угодно. Например, данные, относящиеся к номеру детали, структуре ведомости материалов, номеру телефона, адресу электронной почты, политике компании или процедуре. Я хочу даже расширить это для управления компьютерными аппаратными ресурсами и установленным программным обеспечением.

Я предполагаю, что после того, как информационная сеть начнет заполняться, вы можете начать выполнять классные обходы, такие как «Я хочу написать электронное письмо всем, кто работает над проектом XYZ». Пользователи будут связаны с проектом, поскольку они будут помечены как создающие и изменяющие данные в проекте XYZ. Поэтому, используя проект XYZ в качестве ключа поиска,будет создан огромный набор со всем, что связано с проектом XYZ. Включая ссылки на людей, построивших проект XYZ. Ссылки пользователей будут подключаться к их адресам электронной почты. Таким образом, их участие в проекте XYZ, они будут включены в мою электронную почту. Это резко контрастирует с тем, что какой-то секретарь пытается вести список людей, работающих над проектом. Мы генерируем много списков. Мы тратим много времени на ведение списков и обеспечение их актуальности. И большая часть не добавляет ценности нашей продукции.

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

-121--2028283-

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

Milan(?! Vasic)

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

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

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

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

(?<=Milan)(?! Vasic)

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

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

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

45
ответ дан 28 November 2019 в 00:49
поделиться

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

"My name is Milan, people know me as Milan Vasic"
    .replaceAll("Milan Vasic|Milan", "Milan Vasic"))
24
ответ дан 28 November 2019 в 00:49
поделиться

Когда вы не хотите положить вашу руку регулярное выражение Yon (возможно, вы должны) вы можете сначала заменить всю строку «Милана Васика» с «Милан».

А чем заменить все строки «Милана» с «Миланом Васич».

4
ответ дан 28 November 2019 в 00:49
поделиться

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

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

Другой способ, лечение VASIC как необязательно:

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

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

8
ответ дан 28 November 2019 в 00:49
поделиться

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

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

«Не изобретайте колесо»

3
ответ дан 28 November 2019 в 00:49
поделиться

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

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
ответ дан 28 November 2019 в 00:49
поделиться

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

шаблон keypattern = pattern.compile (ключ); Matcher Matcher = keypattern.matcher (str); String Nersrting = Matcher.replacealll (значение);

1
ответ дан 28 November 2019 в 00:49
поделиться
Другие вопросы по тегам:

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