Заменить все вхождения подстроки в большей строке значением в массиве - PullRequest
1 голос
/ 19 декабря 2011

Я хочу заменить i # (смотрите пример ввода / вывода) значением массива, но я не уверен, как это сделать с Java + Regex.

Предположим, у вас есть массив с: [3,2,1,0]

Пример ввода:
i0
i1 ^ 2
(I1 + 2) + 5
2 * 5 + i1
i1 + i2-i3
1 + 2

Пример вывода:
3 [почему? входное значение равно i0, а индекс 0 = 3 в массиве]
2 ^ 2
(2 + 2) + 5
2 * 5 + 2
2 + 1-0
1 + 2

Regex здесь:
http://rubular.com/r/KXbCQnbs8K

REGEX = i {1} (\ d +)

Код:

private String replace(String input){
    StringBuffer s = new StringBuffer();
    Pattern regex = Pattern.compile(REGEX);
    Matcher m = regex.matcher(input);

    if( !m.find(0) ){
        return input;
    }else{
        m.reset();
    }

    while (m.find() ){
        m.appendReplacement(s, getRealValue(m.group(1)) );
    }
    return s.toString();
}

private String getRealValue(String val){
    int value = Integer.parseInt(val);
    return String.valueOf(array.get(value));
}

Предположим, что данные # всегда действительны Мой код работает в некоторых случаях, но в большинстве случаев не работает. Любая помощь? Спасибо!

EDIT: Я не уверен, как сказать, чтобы добавить последнюю часть (например: +5 в i0 + 5).

i0 - работает
i1 ^ 2 - не работает
(i1 + 2) +5 - не работает
2 * 5 + i1 - работает
i1 + i2-i3 - не работает
1 + 2 - работает
1 + i2 - работает

Я хочу изменить регулярное выражение на "i {1} (\ d +) (. *)"
if (lastMatch ()) {// если последнее совпадение истинно
s + = m.group (2) // объединить последнюю группу (т. е. "+5" в "i0 + 5")
}
Но я не знаю правильный синтаксис для этого.

1 Ответ

3 голосов
/ 19 декабря 2011

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

Но, судя по всему, вы забыли использовать Matcher.appendTail(StringBuffer) после того, как вы сделали все замены.appendTail добавляет все оставшиеся символы после последнего совпадения, например."i0[this bit]".

Я предполагаю, что неправильный вывод был

  • i1^2 -> 2
  • (i1+2)+5 -> (2

Глядя на этобыло бы гораздо быстрее выяснить, что происходит не так.Забывать добавить последний бит строки в конце.Давайте найдем способ разобраться с этим или прочитаем API, чтобы увидеть, есть ли метод, который делает это за один простой шаг для меня.

Пример кода

while (m.find() ){
    m.appendReplacement(s, getRealValue(m.group(1)) );
}
m.appendTail(s); // you missed out this line
return s.toString();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...