Почему эта замена регулярных выражений не работает для 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
^^
Рабочий демонстрационный пример