Почему эта замена регулярного выражения не работает для JavaScript, а работает только для других движков?

Я хочу построить функцию JavaScript, которая преобразует текст в другой формат, из этого:

MATCH 1
1.  [4-17]  `public direct`
2.  [18-29] `routing.key`
MATCH 2
1.  [35-41] `direct`
2.  [42-52] `routingkey`

К этому:

MATCH 1: [Group 1: public direct] [Group 2: routing.key]
MATCH 2: [Group 1: direct] [Group 2: routingkey]

Я возился с этим кодом в консоли браузера Chrome, используя замены регулярных выражений, однако он ничего не заменит. Вот один из подходов, которые я пробовал, a это тестовый объект, проблема на второй замене:

a = "MATCH 1 \n\
1.  [4-17]  `public direct` \n\
2.  [18-29] `routing.key` \n\
MATCH 2 \n\
1.  [35-41] `direct` \n\
2.  [42-52] `routingkey`"

var repl = a.replace(/^(MATCH\s\d+)\s*/gm, "$1: ")
            .replace(/(\d+)\.\s+\[[^]]+\]\s*`([^`]*)`\s*/g, "[Group $1: $2]")
            .replace(/(?=MATCH\s\d+: )/g, "\n")

console.log(repl)

Изучение демонстраций regex101, шаблон /(\d+)\.\s+\[[^]]+\]\s*`([^`]*)`\s*/g правильно заменит в PHP (PCRE) и Python, но не в JavaScript.

Зачем?

1 ответ

Решение

Для реализаций PCRE закрывающая квадратная скобка сама по себе не нуждается в экранировании, поскольку она является первым метасимволом внутри класса символов. В JavaScript [^] представляет допустимый класс символов.

Как указано в документации PCRE:

Закрывающая квадратная скобка сама по себе не является специальной по умолчанию. Однако, если установлена опция PCRE_JAVASCRIPT_COMPAT, одиночная закрывающая квадратная скобка вызывает ошибку во время компиляции. Если в качестве члена класса требуется закрывающая квадратная скобка, он должен быть первым символом данных в классе (после начального огибающего, если он есть) или должен иметь обратную косую черту.

Поэтому вам нужно убежать от этого персонажа.

/(\d+)\.\s+\[[^\]]+\]\s*`([^`]*)`\s*/g
               ^^

Рабочая Демо

Другие вопросы по тегам