Поиск назад в регулярном выражении JS

196
12 февраля 2019, 02:40

Есть строка:
=СУММ(A18:I18)

Нужно написать регулярное выражение где производился бы поиск всех цифр 18 в строке, кроме тех, у которых перед 18 есть буква A.

Пишу /(?<=A)+18/g - выдаёт ошибку Недопустимый квантификатор ?.

Answer 1

В Chrome и любой другой среде, поддерживающей стандарт ECMA2018, можно воспользоваться блоком предварительного просмотра назад:

console.log("=СУММ(A18:I18)".match(/(?<![A\d])18(?!\d)/g)) 
console.log("=СУММ(A18:I18)".replace(/(?<![A\d])18(?!\d)/g, "<ТУТ>$&</ТУТ>"))

Подробности

  • (?<![A\d]) - сразу перед 18 не должно быть A или цифры
  • 18 - 18
  • (?!\d) - сразу после 18 не должно быть цифры

В других случаях придётся решить проблему с помощью захватывающих групп:

var s = "=СУММ(A18:I18)"; 
var rx = /([A\d])?18(?!\d)/g; 
console.log(s.replace(rx, function ($0, $1) { return $1 ? $0 : "<ТУТ>" + $0 + "</ТУТ>" }))

Тут ([A\d])? — необязательная захватывающая группа, она находит A или цифру. Если этот шаблон захватывает текст, буфер группы №1 непустой и в таком случае совпадение 18 является валидным. Если проверка первой группы не проходит успешно, совпадение считается не найденным.

READ ALSO
Передача props между компонентами в React

Передача props между компонентами в React

У меня есть несколько компонентов по сути никак не связанных между собой, первый это ShoppingCards

172
Не работает onYouTubeIframeAPIReady

Не работает onYouTubeIframeAPIReady

При успешной загрузке Ajax функция onYouTubeIframeAPIReady ни в какую не хочет работатьЕсть подозрение, что функция эта вызывается только один раз

164
Замена строк регулярным выражением в JS

Замена строк регулярным выражением в JS

Есть строка: СЧЁТЕСЛИМН('ИСХ_Сделки'!$B:$B;C$3;'ИСХ_Сделки'!$J:$J;$A18)СУММ(C18:I18)AK18+AT18+AB18+S18+J18СУММ(U18:AA18) На выходе нужно получить: СЧЁТЕСЛИМН('ИСХ_Сделки'!$B:$B;C$3;'ИСХ_Сделки'!$J:$J;$A18)СУММ(C122:I122)AK122+AT122+AB122+S122+J122СУММ(U122:AA122)

262