Java String.replace/replaceAll не работает

Итак, я пытаюсь проанализировать входные данные String в Java, которые содержат (открывающие) квадратные скобки. я имею str.replace("\\[", ""), но это абсолютно ничего не делает. я пробовал replaceAll также с более чем одним другим регулярным выражением, но результат всегда неизменен. Часть меня задается вопросом, возможно ли это вызвано тем фактом, что все мои символы обратной косой черты отображаются как символы иены (с тех пор, как я добавил японский язык к моим языкам), но так было уже больше года и не вызывало у меня никакого такие вопросы раньше.

Есть идеи, что я могу здесь делать не так?

3 ответа

Решение

Строки неизменны в Java. Убедитесь, что вы переназначаете возвращаемое значение к тому же String переменная:

str = str.replaceAll("\\[", "");

Для нормального replace Метод, вам не нужно выходить за скобки:

str = str.replace("[", "");
public String replaceAll(String regex, String replacement)

Как показано в приведенном выше коде, метод replaceAll ожидает первый аргумент как регулярное выражение, и, следовательно, вам нужно экранировать символы, такие как "(", ")" и т. Д. (С "\"), если они существуют в тексте замены, который должен быть заменен строки. Например:

String oldString = "This is (stringTobeReplaced) with brackets.";

String newString = oldString.replaceAll("\\(stringTobeReplaced\\)", "");
System.out.println(newString); // will output "This is  with brackets."

Другой способ сделать это - использовать Pattern.quote("str"):

    String newString = oldString.replaceAll(Pattern.quote("(stringTobeReplaced)"), "");

Это будет считать строку как литерал для замены.

Как всегда, проблема не в том, что "ххх не работает", а в том, что вы не знаете, как его использовать.

Перво-наперво:

  • String неизменен; если вы читаете Javadoc .replace() а также .replaceAll(), вы увидите, что оба указывают, что новый Stringэкземпляр возвращается;
  • replace() принимаетстроковый литерал в качестве первого аргумента, а не литерал регулярного выражения.

Что означает, что вы, вероятно, хотели сделать:

str = str.replace("[", "");

Если вы только когда-либо делаете:

str.replace("[", "");

тогда будет создан новый экземпляр, но вы его игнорируете...


Кроме того, и это обычная ловушка с String (другое, что.matches()неправильно), несмотря на их соответствующие имена,.replace() заменяет все вхождения первого аргумента вторым аргументом; единственная разница в том, что .replaceAll() принимает регулярное выражение в качестве первого аргумента и выражение "осведомленное о регулярном выражении" в качестве второго аргумента; для более подробной информации, см. Javadoc Matcher"s .replaceAll(),

Чтобы он работал, он должен находиться внутри метода.

например:

public class AnyClass {
    String str = "gtrg4\r\n" + "grtgy\r\n" + "grtht\r\n" + "htrjt\r\n" + "jtyjr\r\n" + "kytht";

    public String getStringModified() {
        str.replaceAll("\r\n", "");

        return str;
    }
}
Другие вопросы по тегам