Вопрос о методе String.replaceAll () и String.replaceFirst () - PullRequest
1 голос
/ 13 мая 2010

Мне нужно сделать простую операцию замены строки на сегменте строки. Я столкнулся со следующей проблемой и надеюсь получить совет.

  1. В исходной строке, которую я получил, я могу заменить строку, такую ​​как <div class="more">, на что-то другое.
  2. НО, в той же исходной строке, если я захочу заменить очень длинную строку, такую ​​как следующая, она не будет работать. Ничто не заменяется после звонка.

<div class="more"><a href="http://SERVER_name/profiles/atom/mv/theboard/entries/related.do?email=xyz.com&amp;ps=20&amp;since=1273518953218&amp;sinceEntryId=abc-def-123-456">More...</a></div>

Я пробовал эти два метода:

originalString.replaceFirst(moreTag, newContent);
originalString.replaceAll(moreTag, newContent);

Заранее спасибо.

Ответы [ 4 ]

6 голосов
/ 13 мая 2010

Вам необходимо получить результат замены и использовать его дальше:

String newString = originalString.replaceFirst(moreTag, newContent);
System.out.println(newString);

Объяснение: строки в Java неизменны . Поведенческие методы java.lang.String не изменят внутреннее значение. Вместо этого они вернут измененный результат.

Если это все еще не возвращает желаемый результат, то moreTag просто ничего не соответствует. Методы, которые вы упомянули, ожидают регулярное выражение . В javadoc Pattern вы можете найти, как составить правильный шаблон регулярного выражения.

0 голосов
/ 13 мая 2010

Вот пример использования replaceAll и replaceFirst:

    String s = "Hi there! John here!";

    s = s.replaceAll("ere", "arrr");
    System.out.println(s);
    // prints "Hi tharrr! John harrr!"

    s = s.replaceFirst("!", "?");
    System.out.println(s);
    // prints "Hi tharrr? John harrr!"

Как уже упоминалось, оба на самом деле основаны на регулярных выражениях:

    System.out.println("Hello???".replaceAll("?", "!"));
    // throws PatternSyntaxException: Dangling meta character '?'

Проблема здесь в том, что ? является метасимволом регулярных выражений, и чтобы рассматривать его как буквальный знак вопроса, вы должны избегать его:

    System.out.println("Hello???".replaceAll("\\?", "!"));
    // prints "Hello!!!"

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

    String unknown = "?";
    System.out.println(
        "Hello???".replaceAll(Pattern.quote(unknown), "!")
    ); // prints "Hello!!!"

Чтобы немного усложнить ситуацию, замещающая строка на самом деле также основана на регулярных выражениях.

    System.out.println(
        "USD 10".replaceAll("USD", "dollar$")
    );
    // throws StringIndexOutOfBoundsException: index out of range: 7

Для цитирования замещающей строки вы используете Matcher.quoteReplacement:

    System.out.println(
        "USD 10".replaceAll("USD", Matcher.quoteReplacement("dollar$"))
    ); // prints "dollar$ 10"

Но что, если я просто хочу сделать простую замену без регулярных выражений?

Затем, чтобы использовать replaceFirst, вы должны заключить в кавычки и шаблон, и строки замены:

import java.util.regex.Pattern;
import java.util.regex.Matcher;


String replaceFrom = ...;
String replaceTo = ...;

String before = ...;

String after = before.replaceFirst(
   Pattern.quote(replaceFrom), Matcher.quoteReplacement(replaceTo)
);

И если вам нужен replaceAll, тогда вы просто используете вместо этого обычный метод не-регулярных выражений replace:

String after = before.replace(replaceFrom, replaceTo);
0 голосов
/ 13 мая 2010

Строки неизменны, сохраняете ли вы результат операции замены?

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

Также, если вам не нужны регулярные выражения, рассмотрите возможность использования StringTokenizer и StringBuilder.

0 голосов
/ 13 мая 2010

Можете ли вы показать нам свой код?

Знаете ли вы, что ваша строка moreTag (первый аргумент replaceFirst / replaceAll) считается регулярным выражением?

Если вам не нужны регулярные выражения, вы можете использовать простой replace метод.

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