Я пытаюсь создать регулярное выражение, соответствующее <<merge_field>>, а не href="<<merge_field>>

Я использовал конструкцию отрицательного просмотра назад, но она не работает в IE11 и Safari. Есть ли какое-нибудь решение для регулярного выражения?

Текущее выражение: (?<!href=")[<]{2}((?:merge_field))[>]{2}

2
Spike_Doc 13 Ноя 2018 в 13:31

1 ответ

Лучший ответ

В одном регулярном выражении мы сопоставляем часть, которая обычно пропускалась бы, с утверждением просмотра назад href="<<merge_field>>
а также ту часть, которая вам нужна <<merge_field>>.

Это ЕДИНСТВЕННЫЙ способ обойти недостаток ретроспективного просмотра в JS.
Это работает, полностью поглощая плохую часть и перемещая текущую позицию за ней
Другого пути НЕТ , не обманывайтесь.

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

В нашем обратном вызове, если группа 1 соответствует, мы просто возвращаем группу 1, не изменяя ее содержимое.

Если группа 2 совпадает, вы можете решить, нужно ли просто возвращать группу 2, ничего не меняя
(если вы просто записываете его положение или нажимаете элемент массива),
или просто измените его на то, что хотите.

var target = "href=\"<<merge_field>> and <<merge_field>> and href=\"<<merge_field>>";

var targ_new = 
    target.replace( /(href=["']<<merge_field>>)|(<<merge_field>>)/g,
       function( match, grp1, grp2 ) {
          if ( grp1 )
             return grp1;
          return "MRG"; // or return grp2 if just recording location
       }
    );

console.log( "Before:\r\n" + target);
console.log( "After:\r\n" + targ_new );
1
user557597user557597 13 Ноя 2018 в 17:20