Replace java не работает

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

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

Любая идея, что я могу делать неправильно здесь?

4 ответа

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

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

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

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

Читайте также:  Зажигалка тесла не работает

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

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

Как всегда, проблема заключается не в том, что «xxx не работает», а в том, что вы не знаете, как его использовать.

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

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

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

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

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

Источник

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

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

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

3 ответа

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

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

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

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

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

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

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

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

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

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

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

Источник

Почему не работает replaceAll

Есть вот такая строчка

Мне нужно удалить первые 6 символов (rows»:[). Для этого я пишу

Но ничего не происходит. Почему, что не так?

2 ответа 2

Во-первых, если у вас JSON или что-то подобное на входе, то настоятельно рекомендуется использовать соответсвующие парсеры, а не изобретать велосипед. Во-вторых, рекомендовано использовать replace вместо replaceAll, потому как последний работает на регулярных выражениях, а они не самые быстрые. В-третьих, если вы все таки хотите дальше изобретать велосипед, то в данном конкретном случае Ваше выражение не работает по причине наличия в исходной строке спец. символов. Там появляются танцы с бубном в виде экранирования, но , его вы используете в самом реплейсе, а контроля над созданием исходной строки у вас нет. А проблема именно оттуда. Поэтому лучше схитрите и напишите в качестве изобретенного велосипеда вот так string.substring(string.indexOf(«[«)+1); Так вы удалите все до первых квадратных скобок включительно.

String#replace() не модифицирует строку, на которой вызывается, но возвращает изменённую строку. Т.е. надо так:

Всё ещё ищете ответ? Посмотрите другие вопросы с метками java строки или задайте свой вопрос.

Похожие

Подписаться на ленту

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

дизайн сайта / логотип © 2021 Stack Exchange Inc; материалы пользователей предоставляются на условиях лицензии cc by-sa. rev 2021.10.18.40487

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

Источник

Почему replaceAll («$», «») не работает, хотя replace («$», «») работает нормально?

Ввод: 2 или $ hodor или $ arya

В этой программе я просматриваю два параметра (String), первый из которых — шаблон, а второй — текст, в котором я должен найти шаблон. Метод должен возвращать 1, если шаблон совпадает, иначе возвращается 0. При использовании replace он работает нормально, но когда я заменяю replace () на replaceAll (), он не работает должным образом, как ожидалось. Как я могу заставить replaceAll () работать в этой программе.

3 ответа

$ — специальный символ в регулярном выражении (EOL). Вы должны избежать этого

Несмотря на похожее название, это два очень разных метода.

replace заменяет подстроки на другие подстроки (*).

replaceAll использует соответствие регулярному выражению, а $ является там специальным управляющим символом (означающим «конец строки / строки»).

Вы не должны использовать здесь replaceAll , но при необходимости вы должны процитируйте $ :

(*) чтобы еще больше запутать, replace также заменяет все события, поэтому единственное различие в именах методов не полностью описывает разницу в функциях.

Так как replaceAll ожидает строку, определяющую регулярное выражение , а $ означает« конец строки »в регулярных выражениях. По ссылке:

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

Вам нужно экранировать его с помощью обратной косой черты (которая также должна быть экранирована в строковом литерале):

Источник

String.replaceAll (…) Java не работает для \\ и \

Я хочу преобразовать путь к каталогу из:

Я использую функцию replaceAll () и другие функции замены, но они не работают.

Как я могу это сделать?

Я распечатал заявление, он дает мне тот, который я хотел, то есть C: \ Users \ Host \ Desktop \ picture.jpg, но теперь, когда я передаю эту переменную, чтобы открыть файл, я получаю это исключение, почему?

Java.io.FileNotFoundException: C: \ Users \ Host \ Desktop \ picture.jpg

4 ответа

Вы должны использовать:

Или (без рисунка):

Каждому «\» должен предшествовать другой «\». Но это также верно и для предыдущего символа «\», поэтому вы должны писать четыре обратной косой черты каждый раз, когда вам нужна одна в регулярном выражении.

1. Замените двойную обратную косую черту на одну (не то, что вы просили)

Вы должны избегать обратной косой черты с помощью обратной косой черты. Нравится:

Первый параметр нужно экранировать дважды. Один раз для компилятора Java и один раз, потому что вы используете регулярные выражения. Итак, вы хотите заменить две обратные косые черты на одну. Итак, поскольку нам нужно избежать обратной косой черты, добавьте одну обратную косую черту. Теперь у вас есть \\ . Это будет скомпилировано в \ . НО !! вам нужно снова избежать обратной косой черты, потому что первый параметр метода replaceAll использует регулярные выражения. Чтобы избежать этого, добавьте обратную косую черту, но эту обратную косую черту нужно экранировать, поэтому мы получаем \\\\ . Это для обратной косой черты представляет собой одну обратную косую черту в регулярном выражении. Но вы хотите заменить двойную обратную косую черту на одну. Так что используйте 8 обратных косых черт.

Второй параметр метода replaceAll не использует регулярные выражения, но его также необходимо экранировать. Итак, вам нужно экранировать его один раз для компилятора Java и один раз для метода замены: \\\\ . Это скомпилировано в две обратные косые черты, которые интерпретируются как 1 обратная косая черта в методе replaceAll.

2. Замените одиночную обратную косую черту парой обратной косой черты (как вы просили)

Та же логика, что и выше.

3. Используйте replace() вместо replaceAll() .

Разница в том, что метод replace() не использует регулярные выражения, поэтому вам не нужно дважды экранировать каждую обратную косую черту для первого параметра.

Надеюсь, я хорошо объяснил .

— Изменить: исправлена ​​ошибка, указанная xehpuk —

В строках \ по умолчанию используется как escape-символ, поэтому, чтобы выбрать «\» в строке, вы должны использовать «\», а для «\» (то есть черный черный два раза) используйте «\\». Это решит вашу проблему, и это также будет применяться к другим символам, таким как «

РЕДАКТИРОВАТЬ: изменено с replaceAll на replace — здесь вам не нужно регулярное выражение, поэтому не используйте его. (Это было действительно плохое дизайнерское решение со стороны команды Java API, IMO.)

Мое предположение (поскольку вы не предоставили достаточно информации) заключается в том, что вы делаете что-то вроде:

Строки неизменяемы в Java, поэтому вам нужно использовать возвращаемое значение, например.

Если это не ответ на ваш вопрос, предоставьте дополнительную информацию.

(Я также предлагаю, что обычно вам все равно не следует делать это самостоятельно — если это нужно для включения информации во что-то вроде ответа JSON, я бы ожидал, что более широкая библиотека выполнит экранирование для ты.)

Обратите внимание, что требуется удвоение, поскольку \ — это escape-символ для строковых (и символьных) литералов Java. Обратите внимание: поскольку replace не обрабатывает входные данные как шаблоны регулярных выражений, нет необходимости выполнять дальнейшее удвоение, в отличие от replaceAll .

РЕДАКТИРОВАТЬ: теперь вы получаете FileNotFoundException , потому что нет имени файла с двойной обратной косой чертой — что заставило вас подумать, что это было? Если вы хотите, чтобы это было действительное имя файла, почему вы удваиваете обратную косую черту?

Источник

Оцените статью