IE 11 Javascript регулярное выражение замены неправильно заменяет метасимволы - PullRequest
0 голосов
/ 05 июня 2018

При использовании функции замены регулярного выражения в строке, содержащей некоторую комбинацию метасимволов регулярного выражения, символы, которые заменяются в строке, заменяются неправильно.

Я использовал следующее выражение:

string.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&")

Это работает по крайней мере в Chrome и прекрасно работает, например, в JSFiddle, однако в IE 11 (и, вероятно, в большинстве версий IE) это некорректно заменяет символ чем-то неправильным, например:

var string = "test (fake)";
string = string.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");

приводит к:

test \\(fake\\) вместо test \(fake\)

Первоначально я предполагал, что могу просто удалить одну из косых черт во втором аргументе для replace(), однако это приводит к:

test (fake)

По сути, мне кажется, что я не могу экранировать эти символы, потому что я не знаю, как указать, что я хочу заменить его набуквально \( вместо ( или \\(.

Кто-нибудь сталкивался с этим раньше и есть решение, любая идея о том, как я могу обойти это или какой-то альтернативныйспособ избежать этих персонажей?Смена браузера, к сожалению, не вариант.

Вот справочник JSFiddle, чтобы показать, как он работает:

https://jsfiddle.net/k42uygm8/5/

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Мне действительно удалось решить эту проблему следующим образом:

string = string.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "[$&]");

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

Я думаю, это просто ошибка с движком Javascript в моей конкретной версии IE, ничего нового.

0 голосов
/ 05 июня 2018

В качестве строки замены вы указали \\$&.

Теоретически это нормально, но, очевидно, некоторые версии регулярного выражения JavaScript используют $0 как ссылку на все совпадение.

Iпротестировал ваше регулярное выражение и строку замены в regex101.com (разновидность JavaScript regex) и обнаружил, что $0 версия работает там.

Поэтому попробуйте изменить строку замены на \\$0.

Еще одно замечание:

В классах символов (между [ и ]) вам не нужно бежать:

  • ведущий или конечный минус,
  • открытие квадратная скобка ([),
  • фигурные скобки и скобки ({}()),
  • квантификаторы (*+?),
  • точка,
  • ^ и $ якоря,
  • вертикальная черта.

Таким образом, вы можете сократить свое регулярное выражение до [-[\]\/{}()*+?.\\^$|].

Редактировать

Взгляните на https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/lastMatch относительно $& и обратите внимание на фрагмент: Эта функция нене соответствует стандарту .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...