Рубрики
Без рубрики

Полное руководство по замене строки Java

Мой коллега Викрам Аручами из LightRun написал отличный, лаконичный и простой в использовании tnt… С тегом java, учебник.

Мой коллега Викрам Аручами из Light Run написал отличный, краткий и простой в использовании учебник по использованию строки . Заменить() функциональность в Java. Я попросил у него разрешения опубликовать его статью здесь, и он любезно согласился. Его пост – отличный ресурс, чтобы убедиться, что вы понимаете, какая утилита стоит за этими функциями Java, включая примеры.

Одной из наиболее часто используемых функций для строковых объектов в Java является замена строки. С помощью replace() вы можете заменить вхождение Символа или строки литерала другим Символ или Строка литерал.

Вы можете использовать метод String.replace() в таких ситуациях, как:

  • Замена специальных символов в строке (например, Строка с немецким символом ö может быть заменена на oe). Это не изменит смысла мира, но поможет сделать строку более понятной для всех.
  • Чтение данных из CSV-файла со значениями, разделенными запятыми. Разделители могут быть заменены пробелом с помощью метода replace для разделения слов.
  • Обработка URL-адресов на Java. Возможно, вам потребуется закодировать строку для замены специальных символов (например, пробел необходимо заменить на %20 ).

В Java имейте в виду, что Объекты String являются неизменяемыми, что означает, что объект не может быть изменен после его создания. С другой стороны, объекты StringBuffer и StringBuilder являются изменяемыми, что означает, что их можно изменить после их создания. Таким образом, в некоторых ситуациях String.replace() может быть не лучшим способом заменить символ в строке.

В этом уроке вы узнаете:

  • Как String.replace() , StringBuilder.replace() , StringBuffer.replace() можно использовать для замены определенного символа или подстроки в Строка и когда использовать каждую из них. Что происходит с неизменяемым Строка объект при замене() или заменить все() используется.
  • Как String.replaceAll() может заменить все вхождения определенного символа или подстроки в строке.

Использование String.replace()

String.replace() используется для замены всех вхождений определенного символа или подстроки в данном строковом объекте без использования регулярного выражения. В Java доступны два перегруженных метода для replace() : String.replace() с символом и String.replace() с последовательностью символов.

Строка.замените() символом

Этот метод принимает Олдчар и новые персонажи , затем заменяет все oldChar в заданном строковом литерале с новым символом/| и возвращает результирующий Строковый объект.

замена общедоступной строки (символ Олдчар, чар Ньючар)

Строка.заменить() на последовательность символов

Этот метод принимает целевую последовательность символов и заменяющую последовательность символов, затем заменяет всю целевую последовательность символов на заменяющую последовательность символов и возвращает результирующий Строковый объект.

Последовательность символов – это интерфейс в Java, реализованный String, StringBuffer и StringBuilder . Вы можете использовать любую из этих реализаций вместо последовательности символов.

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

Строка.заменить() Примеры

Давайте используем метод replace() с параметром Char types для замены одного символа. Вы будете использовать только одинарные кавычки в параметрах метода replace() для обозначения Олдчар и новые персонажи как Символы . Двойные кавычки делают параметры строкой.

/** * Method to demonstrate the Replace method using the Chars type parameter */
private static void useStringReplaceWithChar() {
  String sourceString = "The world is schön. This is a String with special Character ö";
  String replacedString = sourceString.replace('ö', 'o');
  System.out.println("Source String before replace : " + sourceString + "\n");
  System.out.println("Replaced String : " + replacedString + "\n");
  System.out.println("Source String after replace : " + sourceString);
}

Когда вы выполните описанную выше программу, вы увидите этот вывод:

Source String before replace : The world is schön. This is a String with special Character ö 
Replaced String : The world is schon. This is a String with special Character o 
Source String after replace : The world is schön. This is a String with special Character ö

Несколько вещей, которые следует отметить:

  1. В первой строке была напечатана исходная строка со специальным символом ö
  2. Когда мы использовали метод replace() , все вхождения специального символа ö заменяются на o .
  3. С помощью метода replace() исходная строка не изменяется. Он всегда возвращает новый строковый объект.

Если вы используете метод replace() с параметрами CharSequence типа (обозначается двойными кавычками вместо одинарных):

... 
String replacedString = sourceString.replace("ö", "oe"); 
...

Вы увидите аналогичный вывод и неизмененную исходную строку:

Source String before replace : The world is schön. This is a String with special Character ö 
Replaced String : The world is schoen. This is a String with special Character oe 
Source String after replace : The world is schön. This is a String with special Character ö

Вы также можете использовать метод replace() с реализацией StringBuilder вместо последовательности символов типов”:

...
StringBuilder sourceStrBuilder = new StringBuilder("ö");
StringBuilder targetStrBuilder = new StringBuilder("oe");
String replacedString = sourceString.replace(sourceStrBuilder, targetStrBuilder);
...

При выполнении этого варианта вы увидите тот же результат, что и в предыдущем примере.

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

Использование StringBuilder.replace()

StringBuilder – это изменяемая последовательность символов. Это не потокобезопасно; методы не синхронизированы. Он заменит последовательность подстрок в диапазоне, переданном в качестве параметров индекса, строкой замены.

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

Сначала создайте StringBuilder , инициализированный строкой со специальным символом ö , используя следующее:

String sourceString = "The world is schön. This is a String with special Character ö";
StringBuilder builder = new StringBuilder(sourceString);

Затем используйте метод replace() с помощью StringBuilder .

Метод replace() принимает три параметра: startIndex , endIndex и строка замены .

  • startIndex – это начальный индекс замены в строковом литерале. Это включено, что означает, что если вы укажете 1, индекс 1 строки будет включен в замену.
  • endIndex – это конечный индекс замены в строковом литерале. Это эксклюзивно, что означает, что если вы укажете 5, индекс 5 строки не будет включен в замену. Замены производятся только через индекс 4.
  • строка замены – это фактическая строка замены. Указанный диапазон индексов в строковом литерале будет заменен этой строкой. Индекс заменяемого символа является обязательным параметром, но вы можете использовать метод StringBuilder.indexOf() для определения индекса специального символа, как показано здесь:
int indexOfUmlauts = builder.indexOf("ö");

Теперь у вас есть индекс специальных символов в интернет , который можно передать методу замены. В следующем примере показан полный код Java для использования StringBuilder.replace() :

/** * Demonstrating the Replace method available in StringBuilder */
private static void useStringBuilderReplace() {
  String sourceString = "The world is schön. This is a String with special Character ö";
  StringBuilder builder = new StringBuilder(sourceString);
  int indexOfUmlauts = builder.indexOf("ö");
  System.out.println("Source String before replace : " + sourceString + "\n");
  System.out.println("Using StringBuilder.replace() " + builder.replace(indexOfUmlauts, indexOfUmlauts + 1, "oe") + "\n");
  System.out.println("String builder after replace : " + builder);
}

Когда вы выполните приведенный выше код, вы увидите этот вывод:

Source String before replace : The world is schön. This is a String with special Character ö 
Using StringBuilder.replace() : The world is schoen. This is a String with special Character ö 
String builder after replace : The world is schoen. This is a String with special Character ö

Несколько вещей, которые следует отметить:

  1. В первой строке была напечатана исходная строка со специальным строковым литералом ö .
  2. При использовании метода StringBuilder.replace() используются только символы, указанные в startIndex и endIndex заменяются на o . Это не заменяет все события. Вы можете увидеть персонажа ö в конце не заменяется.
  3. При использовании метода StringBuilder.replace() исходный StringBuilder изменяется. Это происходит потому, что StringBuilder является изменяемым, и он изменяется напрямую.

В некоторых случаях может потребоваться изменчивость, но будьте осторожны. Это может быть непреднамеренный побочный эффект.

Использование StringBuffer.replace()

StringBuffer – это изменяемая последовательность символов. Аналогично StringBuilder.replace() , он заменит последовательность подстрок в диапазоне, переданном в качестве параметров индекса, на строку замены, но это потокобезопасно. Используйте этот метод, если вы хотите выполнить операцию замены в многопоточной программе Java.

Для начала создайте буфер строк, инициализированный строкой со специальным символом ö аналогично тому, как вы сделали с StringBuilder выше:

String sourceString = "The world is schön. This is a String with special Character ö";
StringBuffer buffer = new StringBuffer(sourceString);
The replace() method accepts three parameters:
  • startIndex – это начальный индекс замены в строковом литерале. Это включено, что означает, что если вы укажете 1, индекс 1 строки будет включен в замену.
  • endIndex – это конечный индекс замены в строковом литерале. Это эксклюзивно, что означает, что если вы укажете 5, индекс 5 строки не будет включен в замену. Замены производятся только через индекс 4.
  • строка замены – Фактическая строка замены. Указанный диапазон индексов в строковом литерале будет заменен этой строкой.

Индекс заменяемого символа является обязательным параметром, поэтому для его поиска можно использовать метод indexOf() . В следующем примере показан полный код Java для использования StringBuffer.replace() :

/** * Demonstrating the Replace method available in StringBuffer */
private static void useStringBufferReplace() {
  String sourceString = "The world is schön. This is a String with special Character ö";
  StringBuffer buffer = new StringBuffer(sourceString);
  int indexOfUmlauts = buffer.indexOf("ö");
  System.out.println("Source String before replace : " + sourceString + "\n");
  System.out.println("Using StringBuffer.replace() " + buffer.replace(indexOfUmlauts, indexOfUmlauts + 1, "oe") + "\n");
  System.out.println("String buffer after replace : " + buffer);
}

Так же, как и в случае StringBuilder выше, StringBuffer.replace() не заменяет все экземпляры специального символа и изменяет исходный строковый буфер:

Source String before replace : The world is schön. This is a String with special Character ö 
Using StringBuffer.replace() The world is schoen. This is a String with special Character ö 
String buffer after replace : The world is schoen. This is a String with special Character ö

Использование String.replaceAll()

Последний метод замены строк в Java, который я рассмотрю, – это |String.replaceAll() метод . Он использует регулярное выражение, чтобы проверить, нуждается ли соответствующая подстрока в замене. Подпись метода String.replace() показана здесь:

public String replaceAll(String regex, String replacementString)

Где:

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

Единственное различие между ними заключается в том, что с помощью replaceAll() вы можете использовать регулярное выражение для сопоставления подстроки, которую необходимо заменить, тогда как с помощью replace() вы не можете использовать регулярное выражение . Он принимает только Символ или Последовательность символов .

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

Например, вы можете получить ответ в виде строки HTML, когда используете службу RESTful из своей Java-программы. В HTML-файле вы можете извлечь только текст и игнорировать все теги HTML.

В следующем примере показано, как использовать replaceAll() с регулярным выражением для удаления всех HTML-тегов из ответа:

/** * Demonstrating the replaceAll method using a regular expression */
private static void userStringReplaceAll() {
  String sourceString = "

this is heading1

"; String replacedString = sourceString.replaceAll("<(.|\n)+?>", ""); System.out.println("Source String before replace : " + sourceString + "\n"); System.out.println("Text without HTMl Tags : " + replacedString + "\n"); System.out.println("Source String after replace : " + sourceString); }

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

Когда вы выполните описанную выше программу, вы увидите следующий вывод:

Source String before replace : 

this is heading1

Text without HTML tags : this is heading1 Source String after replace :

this is heading1

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

Вывод

В этом руководстве вы узнали, как использовать методы String.replace() , StringBuilder.replace() и StringBuffer.replace() для замены всех вхождений подстроки. Вы также узнали, какую реализацию Char следует использовать в случае однопоточной или многопоточной Java-программы, и как использовать replaceAll() с регулярным выражением.

Если у вас возникли проблемы с выбором метода замены строк или у вас есть свои собственные предложения, не стесняйтесь оставлять их в комментариях. Я с нетерпением жду, чтобы услышать, что вы думаете.

Оригинал: “https://dev.to/eyalk100/the-complete-guide-to-java-string-replace-4jde”