Странное поведение метода replaceAll строки

#java #string #replace #replaceall

#java #строка #заменить #replaceall

Вопрос:

Я сталкиваюсь со странным поведением метода replaceAll класса String.

У меня есть строковый буфер, который содержит следующие данные

 keyRPT1={keyRPT11=01|keyRPT19=01}|keyRPT3={keyRPT11=03|keyRPT19=01}|keyRPT8={keyRPT11=08|keyRPT19=01}
  

я пишу ниже код для замены "keyRPT11=08|keyRPT19=01" на "keyRPT11=08|keyRPT19=2"

для этого я использую приведенный ниже код

 String complementaryInformation = "keyRPT1={keyRPT11=01|keyRPT19=01}|keyRPT3={keyRPT11=03|keyRPT19=01}|keyRPT8={keyRPT11=08|keyRPT19=01}";

complementaryInformation = complementaryInformation.replaceAll("keyRPT11=08|keyRPT19=01","keyRPT11=08|keyRPT19=2");
  

replaceAll выдает неожиданный результат

 keyRPT1={keyRPT11=01|keyRPT11=08|keyRPT19=2}|keyRPT3={keyRPT11=03|keyRPT11=08|keyRPT19=2|keyRPT8={keyRPT11=08|keyRPT19=2|keyRPT11=08|keyRPT19=2}
  

когда я использую метод replace, я получу правильный результат

 keyRPT1={keyRPT11=01|keyRPT19=01}|keyRPT3={keyRPT11=03|keyRPT19=01}|keyRPT8={keyRPT11=08|keyRPT19=2}
  

Есть идеи, ребята??

Ответ №1:

Вам нужно экранировать | символ, который имеет особое значение в регулярном выражении.

 complementaryInformation = complementaryInformation.replaceAll("keyRPT11=08\|keyRPT19=01","keyRPT11=08|keyRPT19=2");
  

replaceAll() метод принимает шаблон регулярных выражений в качестве первого параметра. replace() метод не принимает регулярное выражение в качестве параметра.

Комментарии:

1. но то же самое работает, когда я вызываю метод replace. почему это так?

2. @MahendraAthneria: смотрите ответ Рубрика. replace не использует регулярные выражения. Если вы не понимаете, почему два метода ведут себя по-разному, сначала обратитесь к документации .

3. @Mahendra: replaceAll() метод принимает шаблон регулярных выражений в качестве первого параметра. replace() метод не принимает регулярное выражение в качестве параметра.

Ответ №2:

String.replaceAll() принимает регулярное выражение, тогда как String.replace() принимает литерал.