Javascript replace all не работает

Содержание
  1. JavaScript | replaceAll() не работает
  2. Почему не работает replaceAll
  3. 2 ответа 2
  4. Всё ещё ищете ответ? Посмотрите другие вопросы с метками java строки или задайте свой вопрос.
  5. Похожие
  6. Подписаться на ленту
  7. 3 способа заменить все вхождения строки в JavaScript
  8. 1. Разбивка и объединение массива
  9. 2. replace() с глобальным регулярным выражением
  10. 2.1 Регулярное выражение из строки
  11. 2.2 replace() строку
  12. 3. Метод replaceAll()
  13. 3.1 Разница между replaceAll() и replace()
  14. 4. Заключение
  15. JavaScript. Быстрый старт
  16. String.prototype.replace()
  17. Сводка
  18. Синтаксис
  19. Параметры
  20. Возвращаемое значение
  21. Описание
  22. Передача строки в качестве второго параметра
  23. Передача функции в качестве второго параметра
  24. Примеры
  25. Пример: использование флагов global и ignore с методом replace()
  26. Пример: передача регулярного выражения в метод replace()
  27. Пример: смена местами слов в строке
  28. Пример: использование функции для изменения сопоставившихся символов
  29. Пример: замена градусов по Фаренгейту на эквивалент в градусах по Цельсию
  30. Пример: использование функции вместе с регулярным выражением для избавления от цикла for

JavaScript | replaceAll() не работает

Столкнулся с такой проблемой, что метод replaceAll() не работает, но я ошибался. Надеюсь помогу тебе решить твою проблему.

Я писал статью на тему «Как заменить двойные пробелы на одинарные?». Задача проще не придумаешь. У меня была строка для экспериментов, которую я скопировал из редактора статей CMS WordPress. Я заранее сделал в строке три двойных пробела. Выглядела она так:

Строка с двойными пробелами — JavaScript

Вызываю на строке метод replaceAll() и вижу, что ничего не изменилось:

В ответ те же самые двойные пробелы. Сознание немного помутнело от того, что даже на JavaScript положиться уже нельзя. Уныние, разочарование. Вроде читаешь официальный мануал, а на деле получаешь «не то».

Замена двойных пробелов в строке на одинарные — JavaScript

Стал разбираться с проблемой. Т. к. я немного знаком с таким понятием как ASCII (American standard code for information interchange), то первое что пришло в голову — «мои клавиатурные пробелы в строках в методе replaceAll() могут каким то образом отличаться от скопированных из редактора». Мне об этом легко говорить т. к. кроме пробелов ничего больше не сравнивалось.

Решил создать дополнительную строковую переменную в которую вводил символы двойных пробелов с клавиатуры.

Переменная str из двух пробелов — JavaScript

Я знал, что существуют печатные и непечатные символы, которые имеют свои уникальные КОДЫ СОПОСТАВЛЕНИЯ. Например, спецсимволы «переноса строки» и «возврата каретки«, которые используются во всех редакторах кода. Именно поэтому существует такое понятие как КОДИРОВКА СИМВОЛОВ. То есть помимо графического / логического представления, есть уникальное числовое представление любого символа в IT.

Я прогнал обе строки на получение СИМВОЛЬНЫХ КОДОВ. И вот что получилось:

Двойной пробел — коды 160, 32 — JavaScript Двойной пробел — коды 32, 32 — JavaScript

В моей строке было два символьных кода — 32, 32

А в строке из Вордпресс была пара — 160, 32

Теперь всё встало на свои места. Метод замены пытается отыскать пару «32, 32», но не находит, потому что её просто не существует в первоначальной строке. Но стоит подать правильную пару «160, 32», как результат становится предсказуемым — выполненным правильно. Пару пробелов «160, 32» скопировал уже из консоли.

Пара 160, 32 скопирована из консоли — JavaScript

Надеюсь эта публикация откроет новый взгляд на мир символов в IT.

Символьный код 160 — неразрывный пробел Символьный код 032 — нормальный пробел

Источник

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

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

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

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

2 ответа 2

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

Читайте также:  Если не работает picasa

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

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

Похожие

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

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

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

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

Источник

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() заменял все вхождения шаблона. Вот как сделать:

В регулярных выражениях литералы добавляют 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 Регулярное выражение из строки

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

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

Читайте также:  Voopoo v thru pro pod не работает

Приведенный выше фрагмент кода пытается преобразовать строку поиска ‘+’ в регулярное выражение. Но ‘+’ является недопустимым регулярным выражением, поэтому выдается 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 на практическом примере по созданию веб-приложения

Источник

String.prototype.replace()

Сводка

Метод replace() возвращает новую строку с некоторыми или всеми сопоставлениями с шаблоном, заменёнными на заменитель. Шаблон может быть строкой или регулярным выражением, а заменитель может быть строкой или функцией, вызываемой при каждом сопоставлении.

Синтаксис

Параметры

Обратите внимание: аргумент flags не работает в ядре v8 (движок JavaScript в Chrome и NodeJs). Строка, задающая комбинацию флагов регулярного выражения. Параметр flags в методе String.prototype.replace() является нестандартным расширением. Вместо использования этого параметра используйте объект RegExp с соответствующими флагами. Значение этого параметра, если он используется, должно быть строкой, состоящей из одного или более следующих символов, следующим образом влияющих на обработку регулярного выражения:

g глобальное сопоставление i игнорировать регистр m сопоставление по нескольким строкам y «липкий» поиск, сопоставление начинается с текущей позиции в строке

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

Новая строка с некоторыми или всеми сопоставлениями шаблона, заменёнными на заменитель.

Описание

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

Для выполнения глобального поиска и замены либо включите флаг g в регулярное выражение, либо, если первый параметр является строкой, включите флаг g в параметр flags .

Передача строки в качестве второго параметра

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

Шаблон Замена
$$ Вставляет символ доллара «$».
$& Вставляет сопоставившуюся подстроку.
$` Вставляет часть строки, предшествующую сопоставившейся подстроке.
$’ Вставляет часть строки, следующую за сопоставившейся подстрокой.
$n или $nn Символы n или nn являются десятичными цифрами, вставляет n-ную сопоставившуюся подгруппу из объекта RegExp в первом параметре.

Передача функции в качестве второго параметра

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

Читайте также:  Настроить доступ для сторонних приложений гугл

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

Возможное имя Получаемое значение
match Сопоставившаяся подстрока (соответствует шаблону замены $& , описанному выше).
p1, p2, . n-ная сопоставившаяся подгруппа из объекта RegExp в первом параметре метода replace() (соответствует шаблонам замены $1 , $2 и так далее, описанным выше). Например, если в качестве шаблона передано регулярное выражение /(\a+)(\b+)/ , параметр p1 будет значение сопоставления с подгруппой \a+ , а параметр p2 — с подгруппой \b+ .
offset Смещение сопоставившейся подстроки внутри всей рассматриваемой строки (например, если вся строка равна ‘abcd’ , а сопоставившаяся подстрока равна ‘bc’ , то этот аргумент будет равен 1).
string Вся рассматриваемая строка.

Точное число аргументов будет зависеть от того, был ли первым аргументом объект RegExp и, если был, сколько подгрупп в нём определено.

Следующий пример установит переменную newString в значение ‘abc — 12345 — #$*%’ :

Примеры

Пример: использование флагов global и ignore с методом replace()

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

Пример: передача регулярного выражения в метод replace()

В следующем примере в метод replace() передаётся регулярное выражение вместе с флагом игнорирования регистра.

Пример выведет строку ‘Twas the night before Christmas. ‘

Пример: смена местами слов в строке

Следующий скрипт меняет местами слова в строке. В качестве текста замены он использует шаблоны замены $1 и $2 .

Пример выведет строку ‘Смит, Джон’.

Пример: использование функции для изменения сопоставившихся символов

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

Функция замены своим параметром принимает сопоставившийся кусок и перед возвратом использует его для преобразования регистра и соединения с дефисом.

Вызов styleHyphenFormat(‘borderTop’) вернёт строку ‘border-top’.

Поскольку мы хотим провести дополнительные преобразования результата сопоставления до того, как будет использована окончательная подстановка, мы должны использовать функцию. Это заставляет нас принудительно вычислить сопоставление перед использование метода toLowerCase() . Если бы мы попытались использовать сопоставление без функции, метод toLowerCase() не сработал бы.

Происходит это потому, что сначала часть ‘$&’.toLowerCase() вычисляется в строковый литерал (результат по-прежнему равен ‘$&’ ), а только потом его символы используются в качестве шаблона.

Пример: замена градусов по Фаренгейту на эквивалент в градусах по Цельсию

В следующем примере градусы по Фаренгейту заменяются на эквивалентные градусы по Цельсию. Градусы по Фаренгейту должны быть числом, оканчивающимся на букву F. Функция возвращает количество градусов по Цельсию, оканчивающиеся на букву C. Например, если входное число равняется 212F, функция вернёт 100C. Если число равняется 0F, функция вернёт -17.77777777777778C.

Регулярное выражение test сопоставляется с любым числом, оканчивающимся на букву F. Количество градусов по Фаренгейту передаётся в функцию через её второй параметр, p1 . Функция переводит градусы по Фаренгейту, переданные в виде строки в функцию code>f2c(), в градусы по Цельсию. Затем функция f2c() возвращает количество градусов по Цельсию. Эта функция работает примерно так же, как и флаг s///e в Perl.

Пример: использование функции вместе с регулярным выражением для избавления от цикла for

Следующий пример принимает строку шаблона и преобразует её в массив объектов.

Входные данные:

Строка, состоящая из символов x , — и _

Выходные данные:

Массив объектов. Символ ‘x’ означает состояние ‘on’ , символ ‘-‘ (дефис) означает состояние ‘off’ , а символ ‘_’ (нижнее подчёркивание) означает продолжительность состояния ‘on’ .

Код:

Этот код сгенерирует массив из трёх объектов в описанном формате без использования цикла for .

Источник

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