Работа с текстом в Java

У меня есть строка в таком формате:

"key=some value|otherkey=other value|key3=yet another value"

Мне нужно создать функцию с этой подписью:

public String update(String all,String key, String value)

Где all — предыдущая строка, key — заданный ключ для замены (или добавления) и value — новое значение.

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

PS: у меня нет проблем с использованием регулярных выражений, но это нужно делать без какой-либо сторонней библиотеки, только со стандартной java-библиотекой.

Спасибо!


person Pablo Fernandez    schedule 12.08.2010    source источник
comment
Я бы использовал систему регулярных выражений Java.   -  person Starkey    schedule 13.08.2010
comment
Что случилось с другим ответом? Это было хорошо   -  person Pablo Fernandez    schedule 13.08.2010
comment
Это не сработало, если в ключе или значении были символы регулярных выражений. Я предполагаю, что Роман снял его, чтобы поработать над этим.   -  person tucuxi    schedule 13.08.2010
comment
Жаль, получилось лаконично и изящно.   -  person Pablo Fernandez    schedule 13.08.2010


Ответы (2)


Могу я спросить, почему вы используете для этого String? Я понимаю, что, вероятно, уже слишком поздно что-то менять на данном этапе, но не лучше ли использовать «Карту» для такой обработки? Тогда вы могли бы просто обновить, используя очень подходящие (в данном случае) методы Map?

Пример:

myMap.put(K key, V value)//you could use a HashMap maybe.

SP

person Split Personality    schedule 12.08.2010

Простой код ниже, без регулярных выражений.

public String update(String all, String key, String value) {    
    StringBuilder result = new StringBuilder();
    boolean replaced = false;   
    for (String old : all.split("[|]")) {
        if (old.startsWith(key + "=")) {
            replaced = true;
            result.append("|" + key + "=" + value);
        } else {
            result.append("|" + old);
        }
    }
    if ( ! replaced) {
        result.append("|" + key + "=" + value);
    }    
    return result.toString().substring(1); // avoid initial '|'
}
person tucuxi    schedule 12.08.2010
comment
Вау! Хороший способ убрать лишнюю трубу. Раньше я ставил лишнюю единицу в конце, а затем делал какие-то странные подстроки-фу. Этот способ намного намного лучше! - person Pablo Fernandez; 13.08.2010
comment
Работает только потому, что строка гарантированно не пуста. В противном случае оператор if был бы неизбежен. - person tucuxi; 13.08.2010