10 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Пример использования метода replace в Java. Как заменить символ в строке?

Метод replace()

Описание

Метод replace() ищет строку для указанного значения или регулярного выражения и возвращает новую строку, где указанные значения будут заменены.

Применение: Метод не изменяет строку, для которой он вызывается.

Синтаксис

Возвращаемое значение

Новая строка, в которой указанные значения были заменены новым значением.

Этот метод не изменяет объект String, на котором он вызывается. Он просто возвращает новую строку.

Примеры

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

В этом примере строка “at” передается в качестве первого аргумента в метод replace() для замены значением “ond”. В результате в первом совпадении слово “cat” изменяется на “cond”, но вся остальная часть строки остается неизменной.

Чтобы заменить все совпадения, нужно использовать для поиска не строку “at”, а регулярное выражение /at/g, причём обязательно с флагом g:

Строка в качестве второго параметра

Если вы указываете строку как второй параметр – она может включать в себя следующие специальные шаблоны замены:

Пример использования скобок и $1, $2:

Пример, с использованием подстроки, совпадающей со всем шаблоном $&:

Функция в качестве второго параметра

Если вы указываете функцию в качестве второго параметра, то она вызывается при каждом совпадении. При наличии одного со­впадения в нее передаются три аргумента: совпадение, позиция совпадения в строке и вся строка. Если групп захвата несколько, каждая совпавшая строка передается в функцию как аргумент, при этом двумя последними аргументами являются по­зиция совпадения с шаблоном в строке и оригинальная строка. Результат вызова функции (её возвращаемое значение) будет использоваться в качестве строки замены.

Функция принимает следующие аргументы:

  1. match – найденное совпадение, (cоответствует шаблону замены $&, описанному выше).
  2. p1, p2, . pn – содержимое скобок (если есть), из объекта RegExp в первом параметре метода replace() (cоответствует шаблонам замены $1, $2 и так далее, описанным выше). Например, если в качестве шаблона передано регулярное выражение /(a+)(b+)/, параметр p1 будет значение сопоставления с подгруппой a+, а параметр p2 — с подгруппой b+.
  3. offset – позиция, на которой найдено совпадение (например, если вся строка равна ‘abcd’, а сопоставившаяся подстрока равна ‘bc’, то этот аргумент будет равен 1).
  4. string – исходная строка.

Если скобок в регулярном выражении нет, то у функции всегда будет ровно 3 аргумента: replacer(match, offset, string).

Пример, с использованием функции, выводящей полную информацию о совпадениях:

3 способа заменить все вхождения строки в JavaScript

Дата публикации: 2020-01-27

От автора: JavaScript не предоставляет простой способ заменить все вхождения строк. Ирония заключается в том, что Java, который послужил источником вдохновения для JavaScript в первые дни, использует метод replaceAll() для строк с 1995 года!

В этом посте описываются 2 обходных пути для замены всех вхождений строк в JavaScript: разбиение и объединение строк, и replace() в сочетании с регулярным выражением.

В конце, вы прочтете о новом предложении String.prototype.replaceAll() (на этапе 3), которое реализует метод replaceAll() для строк.

1. Разбивка и объединение массива

Первый подход для замены всех вхождений строки состоит из 2 этапов:

Разбить строку на части по строке поиска.

JavaScript. Быстрый старт

Изучите основы JavaScript на практическом примере по созданию веб-приложения

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

Например, давайте заменим + на — в строке ’1+2+3′. Сначала ’1+2+3′ делится на +, что дает [‘1’, ‘2’, ‘3’] отдельно. Затем эти части соединяются через — между ними, что дает ’1-2-3′. Вот как вы можете использовать методы split() и join() для достижения этого в JavaScript:

‘duck duck go’.split(‘duck’) разбивает строку на части: [”, ‘ ‘, ‘ go’].

Затем эти части соединяются [”, ‘ ‘, ‘ go’].join(‘goose’), с добавлением ‘goose’ между ними, что дает строку ‘goose goose go’.

Вот обобщенная вспомогательная функция, которая использует разбиение и объединение:

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

2. replace() с глобальным регулярным выражением

String.prototype.replace(regExp, replaceWith) ищет вхождения с помощью регулярного выражения regExp, а затем заменяет все совпадения на строку replaceWith.

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

Читать еще:  Как исправить ошибку ERR_TIMED_OUT в Chrome, если сброс настроек не дал результатов

В регулярных выражениях литералы добавляют g после раздела флагов: /search/g

В случае конструктора регулярного выражения используйте аргумент флага: new RegExp(‘search’, ‘g’)

Давайте заменим все вхождения ‘duck’ на ‘goose’:

Литерал регулярного выражения /duck/g соответствует строке ‘duck’ и имеет включенный глобальный режим.

‘duck duck go’.replace(/duck/g, ‘goose’) заменяет все вхождения подстрок /duck/g на ‘goose’.

Вы можете легко выполнить замены без учета регистра, добавив к регулярному выражению флаг i:

Снова посмотрим на регулярное выражение: /duck/gi. Регулярное выражение включило поиск без учета регистра i, наряду с глобальным флагом g. /duck/gi соответствует ‘duck’, а также ‘DUCK’, ‘Duck’ и так далее.

JavaScript. Быстрый старт

Изучите основы JavaScript на практическом примере по созданию веб-приложения

‘DUCK duck go’.replace(/duck/gi, ‘goose’) заменяет все вхождения подстрок /duck/gi без учета регистра на ‘goose’.

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

2.1 Регулярное выражение из строки

Использование подхода с регулярными выражениями неудобно, когда строка поиска определяется во время выполнения. При создании регулярного выражения из строки вы должны экранировать символы — [ ] / < >( ) * + ? . ^ $ |.

Вот пример проблемы:

Приведенный выше фрагмент кода пытается преобразовать строку поиска ‘+’ в регулярное выражение. Но ‘+’ является недопустимым регулярным выражением, поэтому выдается SyntaxError: Invalid regular expression: /+/.

Использование символа ‘\+’ решает проблему. Для простой замены всех вхождений задача, связанная с регулярными выражениями и экранированием строки поиска, является слишком сложной.

2.2 replace() строку

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

‘duck duck go’.replace(‘duck’, ‘goose’) заменяет только первое вхождение ‘duck’ на ‘goose’.

3. Метод replaceAll()

Наконец, новое предложение String.prototype.replaceAll () (на этапе 3) переносит replaceAll() метод на строки. Строковый метод replaceAll(search, replaceWith) заменяет все вхождения строки search на replaceWith без каких-либо обходных методов.

Давайте заменим все вхождения ‘duck’ на ‘goose’:

‘duck duck go’.replaceAll(‘duck’, ‘goose’) заменяет все вхождения строки ‘duck’ на ‘goose’. Это простое решение.

3.1 Разница между replaceAll() и replace()

Строковые методы replaceAll(search, replaceWith) и replace(search, replaceWith) ведут себя одинаково, за исключением двух моментов:

Если аргумент search является строкой, replaceAll() заменяет все вхождения из search на replaceWith, в то время как replace() только первое вхождение

Если аргумент search является неглобальным регулярным выражением, replaceAll() генерирует исключение TypeError.

4. Заключение

Замена всех вхождений строк должна быть простой задачей. Однако в JavaScript давно не было способа сделать это. Один из подходов заключается в том, чтобы разбить строку на куски с помощью строки поиска, объединить их обратно строку, размещая строку замены между кусками: string.split(search).join(replaceWith). Этот подход работает, но он является хаком.

Другой подход заключается в использование String.prototype.replace() с регулярным выражением с включенным глобальным поиском: string.replace(/SEARCH/g, replaceWith).

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

Наконец, метод String.prototype.replaceAll() может легко заменить все вхождения строки напрямую: string.replaceAll(search, replaceWith). Это предложение на третьем этапе, но, надеюсь, оно скоро появится в новом стандарте JavaScript.

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

Автор: Dmitri Pavlutin

Редакция: Команда webformyself.

JavaScript. Быстрый старт

Изучите основы JavaScript на практическом примере по созданию веб-приложения

JavaScript. Быстрый старт

Изучите основы JavaScript на практическом примере по созданию веб-приложения

Пример использования метода replace в Java. Как заменить символ в строке?

Строка — это упорядоченная последовательность символов. В Java строка является основным носителем текстовой информации. Для работы со строками здесь используются следующие классы: String, StringBuilder, StringBuffer. В этом уроке речь пойдет о классе String, его на первых порах будет вполне достаточно.

В данном уроке рассматривается:

В уроке 6 уже упоминалась работа со строками, а именно, как создавать строку. Также частично со строками мы встречались в предыдущих уроках. В этом и следующих двух уроках мы углубим знания о строках. В этом уроке будут рассмотрены создание строк в Java и наиболее популярные методы при работе со строками. Следующий урок будет посвящен форматированию строк. И еще один урок будет на тему работы с регулярными выражениями в Java, поскольку регулярные выражения достаточно мощный и нужный инструмент при работе со строками.

Читать еще:  Как прошить телефон если он кирпич. Восстановление телефона Android после прошивки

Но начнем с самого начала.

Создание строк

Строка в Java является объектом, поэтому ее можно создать, как и любой другой объект, при помощи оператора new.

Также строку можно создать при помощи литерала (фразы заключенной в кавычки) следующим образом.

Обе строки, независимо от способа создания являются объектами — экземплярами класса String.

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

Можно также создать массив строк. Например, так:

Подробнее о массивах и их создании написано в уроке 10 .

Конкатенация или слияние строк в Java

Для того, чтобы объединить несколько разных строк в одну, в Java можно использовать перегруженные (специально для объектов String) операторы «+» и «=+».

Еще один важный момент : операторы «+» и «=+», перегруженные для String, являются единственными перегруженными операторами в Java. Программист здесь не имеет возможности самостоятельно перегружать какие-либо операторы (как, например, в С++ и некоторых других языках).

Пример 1:

На консоль будет выведено «Мама мыла раму»

Пример 2:

Пример 3:

Наиболее употребительные методы класса String

При использовании IDE можно легко увидеть, какие методы есть у класса и получить подсказку по их использованию. На примере IDE Eclipse: для того, чтобы открыть список методов и быстро выбрать подходящий, нужно после имени переменной поставить точку и нажать комбинацию клавиш CTRL + Space (пробел). После этого появится окно, как на рисунке 14.1, где будут перечислены все доступные методы класса.

При выборе метода из этого списка, справа (или слева) появится желтое окно с подсказкой по его использованию. При помощи нажатия Enter или двойного клика мыши метод можно вставить в ваш код, не прибегая к ручному набору.
Также после имени переменной и точки можно начать набирать вручную имя метода и после введения нескольких первых букв нажать CTRL + Space (пробел). При этом, если метод, начинающийся на эти буквы один, то он автоматически подставится в код, если методов несколько, то откроется окно, как на рисунке 14.1, где будут перечислены только те методы, которые начинаются с этих введенных вами букв.
Это было лирическое отступление о том, как облегчить себе жизнь. Далее рассмотрим методы, которые чаще всего используются при работе со строками. Некоторые задачи можно решить и без применения этих методов, но их знание значительно облегчает процесс программирования. В дальнейшем описании, первое слово, которое стоит перед названием метода — тип значения, которое возникнет в результате работы метода (значение, которое метод возвращает).

Еще раз конкатенация

String concat(String str) — производит ту же конкатенацию, что была описана выше, но использование этого метода из класса String положительно влияет на производительность и скорость программы. На небольших примерах это незаметно и не существенно, но в более серьезных приложениях стоит использовать этот метод. Результатом работы метода будет строка. Параметр, который нужно передавать в метод для конкатенации — тоже строка, о чем нам говорит значение в скобках (String str).

Перепишем пример 2, при помощи concat():

Определение количества символов в строке

Для того чтобы определить количество символов в строке, используется метод length.

int length() возвращает длину строки. Длина равна количеству символов Unicode в строке.

Пример 4:

Извлечение символов из строки

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

char charAt(int index) возвращает символ, находящийся по указанному индексу в строке. Результатом работы метода будет символ типа char. Параметр, который передается в метод — целое число. Первый символ в строке, подобно массивам, имеет индекс 0.

Пример 5: определить последний символ в строке.

Если мы хотим работать со строкой, как с массивом символов, можем конвертировать строку в массив при помощи метода toCharArray.

char[] toCharArray() — преобразует строку в новый массив символов.

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

Читать еще:  Какие есть флеш плееры кроме адобе?

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

Извлечение подстроки из строки

String substring(int beginIndex, int endIndex) или substring(int beginIndex) — возвращает новую строку, которая является подстрокой используемой строки. В параметрах метода нужно указать индекс строки, с которого начинается подстрока и индекс, которым заканчивается. Также возможно указывать только начальный индекс. В этом случае будет возвращена подстрока от начального индекса и до конца строки.

Пример 7.

Разбиение строк

Для разбиения строк на части используется метод String[] split(String regex), который разбивает строку на основании заданного регулярного выражения. О регулярных выражениях поговорим в одном из следующих уроков. Здесь покажем пример простого разбиения строки заданного одним символом.

Пример 8.

Поиск в строке

boolean contains(CharSequence s) — проверяет, содержит ли строка заданную последовательность символов и возвращает true или false.

Пример 9.

boolean endsWith(String suffix) — проверяет завершается ли строка определенными символами и возвращает true или false.

Пример 10.

boolean startsWith(String prefix) или startsWith(String prefix, int toffset) — проверяет, начинается ли строка с определенных символов. Во втором случае можно указать позицию с которой необходимо начать поиск префикса.

Пример 11.

int indexOf(int ch), indexOf(int ch, int fromIndex), indexOf(String str), indexOf(String str, int fromIndex) — метод indexOf применяется для поиска первого вхождения указанного символа в строке или первого вхождения указанной подстроки. Поиск также можно произвести с указанием позиции в строке от которой нужно начинать искать. Для поиска нужно указать соответствующие параметры. Метод возвращает число соответствующее индексу первого вхождения символа или подстроки. В случае отсутствия указанного символа или подстроки в строке, будет возвращена -1.

Пример 12

int lastIndexOf(int ch), lastIndexOf(int ch, int fromIndex), lastIndexOf(String str), lastIndexOf(String str, int fromIndex) — аналогично предыдущему случаю, только ищется последнее вхождение символа или подстроки в строке.

Модификация строк

Модификация строк не является модификацией как таковой. Дело в том, что объекты класса String после создания уже нельзя изменять. Но можно создать копию строки с изменениями. Именно это и делают следующие методы.
toLowerCase() — преобразовать строку в нижний регистр;
toUpperCase() — преобразовать строку в верхний регистр;
trim() — отсечь на концах строки пустые символы;

String replace(char oldChar, char newChar), replace(CharSequence target, CharSequence replacement) — замена в строке одного символа или подстроки на другой символ или подстроку.

Вспомним пример 6, где нужно было поменять в строке символы пробела на точки и перепишем его с использованием replace:

Сравнение строк

boolean equals(Object anObject) — проверяет идентичность строк. Возвращает true только в том случае, если в строках представлена одинаковая последовательность символов одной величены.

Пример 14

int compareTo(String anotherString) — так же проверяет идентичность строк, однако, в отличии от метода equals возвращает:

  • нулевое значение, если строки равны,
  • целое отрицательное число, если первая строка предшествует второй
  • целое положительное число, если первая строка следует за второй

Данный метод предназначен для упорядочивания строк. Он позволяет сравнить строки между собой и определить предшествующую строку. Для того, чтобы реализовать такое сравнение метод сравнивает числовые значения букв.

Рассмотрим пример с именами «Маша» и «Миша». При сравнении этих двух имен (пример 15), метод compareTo укажет, что имя «Маша» предшествует имени «Миша» (выдав отрицательное число) или наоборот, «Миша» следует за «Маша» (выдав положительное число). При упорядочивании имен по алфавиту мы бы упорядочили эти имена именно так. Метод в данном случае определяет, что числовое значение буквы «а» в «Маша» меньше, чем числовое значение «и» в Миша.

Пример 15

Однако, в случае, если мы напишем «маша» с маленькой буквы и попробуем сравнить с «Миша», то получим положительное число.

То есть в данном случае имя «Миша» предшествует имени «маша». Это происходит потому, что в таблице символов Юникода буквы верхнего регистра предшествуют нижнему.

Для сравнения строк без учета регистра символов используется функция int compareToIgnoreCase(String str)

Как мы видим, при сравнивании «маша» с «Миша» мы снова получаем отрицательное значение, то есть «маша» предшествует имени «Миша».

голоса
Рейтинг статьи
Ссылка на основную публикацию
Статьи c упоминанием слов: