Java replaceall не работает

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

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

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

3 ответа

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

Для нормального 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() принимаетстроковый литерал в качестве первого аргумента, а не литерал регулярного выражения.
Читайте также:  Php test image type

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

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

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

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

Источник

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

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

4 ответа

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

Да, подсказка в возвращаемом типе, uchuujin: зачем replaceAll возвращать String, если он изменил String на месте; разве это не должно быть void ?

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

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)"), ""); 

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

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

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

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

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

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

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

Ещё вопросы

  • 0 Следующим узлом двусвязного списка является приватный
  • 0 Увеличить межпроцессную строку без разделяемой памяти
  • 1 Неверный объект, использующий общее табличное выражение WITH
  • 0 Как выбрать дату в jquery datepicker на основе другого jquery datepicker
  • 0 вставить HTML-разметку в HTML-строку PHP
  • 1 PDFBox символов плохие символы в разговоре PDF в строку
  • 1 как получить значения для пользовательских полей пользовательской записи в Netsuite
  • 1 NodeJS Websockets — завершить сокет после отправки данных
  • 1 Где я могу найти больше информации о разрешениях для Android?
  • 3 Добавление нескольких перехватчиков в OkHttpClient
  • 0 Зацикливание SVG прямоугольников из базы данных
  • 0 PHP заменить все предложение из строки
  • 1 FireBase Multi Path обновление и правила для каждого пути
  • 1 Декомпрессия ZLib
  • 1 установка Swing JDialog на немодальный
  • 0 Случайное перемешивание с использованием вектора
  • 0 Может ли PHP использовать переменные до их определения?
  • 0 Doxygen — групповые функции и их поиск по индексу
  • 1 Преобразование списка массивов numpy в один массив int
  • 0 Облачный сервер базы данных и физическая база данных
  • 0 MySQL SELECT, если нет более новой записи
  • 0 spl_autoload_register создавать экземпляры классов
  • 0 Два счетчика в пределах заявления Smartys Foreach
  • 1 Исключение NoClassDefFoundError
  • 0 Как бороться с необработанным отказом SequelizeConnectionError: подключить ETIMEDOUT
  • 1 как проверить конструктор экземпляра
  • 1 Потери Keras постоянно низкие, но точность начинается с высокой, а затем падает
  • 0 Проводные кнопки для выбора / отмены выбора из динамически создаваемых списков
  • 0 Клонировать элементы ввода и очистить значения после
  • 0 JQuery выбрать конкретную группу и удалить параметры
  • 1 Невозможно запустить приложение на Android 7.1.2 через appium в Eclipse
  • 1 Обязательны ли определения типов для пакетов npm только на компьютере разработчика?
  • 1 Как я могу объединить результаты покрытия с токсиком?
  • 1 Java nullPointerException при заполнении объекта Hierarchy с помощью saxParser
  • 0 Запрос C # LINQ с вычисляемым полем и подзапросом в предложении Select
  • 1 Объединение данных в цикле
  • 1 Использование HttpResponseMessage для просмотра ошибок
  • 1 REPO (aosp) переключение между филиалами
  • 1 Tkinter: Можно ли встроить поля ввода в текстовый абзац, чтобы выполнить задачу закрытия?
  • 1 нахождение контуров корня растения
  • 1 Python конвертирование из c # Расчет CRC8 из кадра 4/5 байт
  • 0 CSS для стилей кнопок — проблема с IE
  • 0 Вставка выбранного значения из заполненного MySQL выпадающего
  • 0 JQuery Cycle2 без позиции изображения Div позиция
  • 0 Запрос PDO Связывание таблиц и отображение результатов
  • 1 Как установить элементы заливки в BottomNavigationView на Android
  • 0 Как добавить переменные массива в таблицу базы данных
  • 0 Как создать клон tr и вставить данные в новую строку, используя javascript или jquery?
  • 0 Php oci8 и другие расширения
  • 0 Остановить браузер от чтения медиа-запросов

Источник

ReplaceAll не работает

Таким образом, вывод такой же, как String s, и он не заменяет ‘ с помощью \’ . Однако он отлично работает с replace() , поэтому в чем проблема с replaceAll() ?

Просто используйте String.replace(CharSequence target, CharSequence replacement) если вы имеете дело с буквальными строками:

Он заменит все экземпляры ‘ в строке \’ .

Хотя нет никакой проблемы с тем, что «‘» является шаблоном, строка замены «\\'» является источником вашей проблемы. Так как строка замены может содержать специальные последовательности, такие как $1 чтобы ссылаться на текст, захваченный группой захвата, синтаксис должен указывать простой $ , указывая \\$ . Это экранирование вызовет \’ интерпретацию ‘ в синтаксисе замены строки.

Вот почему вам нужно удвоить экранирование «\\\\'» чтобы строка замены корректно работала. Один слой экранирования, чтобы дать \\’ функции replaceAll / replaceFirst , следующий слой, чтобы строка замены интерпретировалась как \’ .

В этом случае Matcher.quoteReplacement(String s) можно использовать для Matcher.quoteReplacement(String s) замены, если вы хотите заменить на фиксированную строку:

s.replaceAll("'", Matcher.quoteReplacement("\\'")) 
String s = "A'BDG"; System.out.println(s.replaceAll("\\'", "\\\\'")); 

Вам нужно сбежать ‘ by \\ с replaceAll()

Когда вы используете функцию замены, он по-разному идентифицирует escape-символы и добавляет другой\\и вызывает метод replaceAll правильным способом. если вы это сделаете

Но если вы вызываете функцию replaceAll напрямую, у нее нет никакой подсказки для определения специальных характеристик, таких как ‘\ по своему усмотрению. Если вы замените функцию, вы увидите, что дополнительные\будут добавлены к этим escape-символам методом quoteReplacement в функции replaceall.

поэтому, если вы хотите использовать замену всей функции, используйте ее с дополнительными экранами выхода, например

Источник

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