У меня есть HTML-код до и после строки:
name="some_text_0_some_text"
Я хотел бы заменить что- 0
то вроде:!NEW_ID!
Итак, я сделал простое регулярное выражение:
.*name="\w+(\d+)\w+".*
Но я не вижу, как заменить исключительно захваченный блок.
Есть ли способ заменить захваченный результат, например ($ 1), какой-нибудь другой строкой?
Результат будет:
name="some_text_!NEW_ID!_some_text"
javascript
regex
Николя Гийом
источник
источник
$
, поэтому первое слово(\w+)
находится в группе и становится$1
средней частью(\d+)
второй группы ((но получает игнорируется при замене), а третья группа есть$3
. Поэтому, когда вы задаете строку замены"$1!new_ID!$3"
, $ 1 и $ 3 автоматически заменяются первой группой и третьей группой, что позволяет заменить 2-ю группу новой строкой, сохраняя текст, окружающий ее.Теперь, когда у Javascript есть взгляд назад (по состоянию на ES2018 ), в более новых средах вы можете полностью избегать групп в подобных ситуациях. Скорее, посмотрите за тем, что предшествует группе, которую вы захватывали, и посмотрите вперед, и замените просто
!NEW_ID!
:При использовании этого метода полное совпадение - это только та часть, которую необходимо заменить.
(?<=name="\w+)
- Lookbehind forname"
, за которым следуют символы слова (к счастью, lookavhinds не обязательно должны иметь фиксированную ширину в Javascript!)\d+
- Соответствие одной или нескольким цифрам - единственная часть шаблона, которая не находится в поиске, единственная часть строки, которая будет в полученном совпадении(?=\w+")
- Смотрим вперед для символов слова, за которыми следует"
`Имейте в виду, что взгляд сзади довольно новый. Он работает в современных версиях V8 (включая Chrome, Opera и Node), но не в большинстве других сред , по крайней мере, пока. Таким образом, хотя вы можете надежно использовать lookbehind в Node и в своем собственном браузере (если он работает в современной версии V8), он еще недостаточно поддерживается случайными клиентами (как на общедоступном веб-сайте).
источник
\d+
, верно?match => match * 2
. Цифры по-прежнему полностью совпадают, поэтому нет необходимости в группахНебольшое улучшение в ответе Мэтью может быть предвкушением вместо последней группы захвата:
Или вы можете разделить десятичную дробь и присоединиться к вашему новому идентификатору, например так:
Пример / тест здесь: https://codepen.io/jogai/full/oyNXBX
источник
С двумя группами захвата было бы также возможно; Я бы также добавил две черточки, как дополнительные левую и правую границы, до и после цифр, и измененное выражение выглядело бы так:
RegEx Circuit
jex.im визуализирует регулярные выражения:
источник
Более простой вариант - просто захватить цифры и заменить их.
Ресурсы
источник