Используемое регулярное выражение:
/\.((?:ram)?[bB]am\([^)]*\))(?!.*\.(ram)?[bB]am\()/
\.
Период совпадений. (?:ram)?
По выбору соответствует ram
в без захвата группа. [bB]am
Совпадения bam
или Bam
. \(
Совпадения (
. [^)]*
Совпадения, содержащие не менее 0 символов поскольку они не )
. )
Соответствует )
. Элементы с 2 по 6. помещаются в группу захвата 1. (?!.*\.(ram)?[bB]am\()
Это отрицательное утверждение о том, что остальная часть строки не содержит дальнейшего экземпляра .ram(
или .rambam(
или * 1034. * и, следовательно, это последний экземпляр.
См. демонстрацию Regex
let str = 'var std = new Bammer({mode:"deg"}).bam(0, 112).bam(177.58, 0).bam(0, -42).ramBam(8.1, 0).bam(8.1, slot_height)';
console.log(str.replace(/\.((?:ram)?[bB]am\([^)]*\))(?!.*\.(ram)?[bB]am\()/, '<span class="focus">.$1</span>'));
Обновление
Механизм регулярных выражений JavaScript недостаточно мощен для обработки вложенных скобок. Единственный способ решения этой проблемы, который я знаю, - это если предположить, что после последнего вызова bam
или ramBam
в строке больше нет посторонних правых скобок. Тогда, когда я сканировал выражение в скобках с помощью \([^)]*\)
, которое не смогло бы взять окончательные скобки, мы теперь должны использовать \(.*\)
, чтобы сканировать все до последних скобок. По крайней мере, я не знаю другого пути. Но это также означает, что способ, который я использовал для определения конечного экземпляра ram
или ramBam
с использованием отрицательного прогноза, требует небольшой корректировки. Мне нужно убедиться, что у меня есть окончательный экземпляр ram
или ramBam
до . Я начинаю делать любые жадные совпадения:
(\.(?:bam|ramBam)(?!.*\.(bam|ramBam)\()\((.*)\))
См. Regex Demo
\.
Соответствует .
. (?:bam|ramBam)
Соответствует bam или ramBam. (?!.*\.(bam|ramBam)\()
Утверждает, что пункт 1. был последним экземпляром \(
Матчи (
. (.*)
Жадно сопоставляет все до ... \)
финал )
. )
Элементы с 1 по 6. помещаются в группу захвата 1.
let str = 'var std = new Bammer({mode:"deg"}).bam(0, 112).bam(177.58, (line-4)/2).bam(0, -42) .ramBam(8.1, 0).bam(8.1, (slot_height-thick)/2)';
console.log(str.replace(/(\.(?:bam|ramBam)(?!.*\.(bam|ramBam)\()\((.*)\))/, '<span class="focus">$1</span>'));