Сопоставление многострочной группы Regex JavaScript возвращает только часть ожидаемого результата в node.js

Я хочу сопоставить группу от --[[ до --]] + одну строку после этого с contents.match(new RegExp(/--\[\[\s([^]*?)\s--\]\]\s(.*)/, 'g'));

Зачем тестировать это регулярное выражение в режиме JS на https://regex101.com/r/7yjQCS/2 работает, но в node.js я получаю совпадение до --]]?

-

результат:

--[[ * a * b * c --]]

-

ожидал:

--[[ * a * b * c --]] function name(x, y) {

-

код:

var contents = "--[[\n * a\n * b\n * c\n--]]\nfunction name(x, y) {\n ...\n}\n\n--[[\n * a\n * b\n * c\n--]]\nfunction name(x, y) {\n ...\n}"; var inputs = contents.match(new RegExp(/--\[\[\s([^]*?)\s--\]\]\s(.*)/, 'g'));


person Ultra    schedule 28.03.2017    source источник
comment
Я не знаю, в какой версии узла вы находитесь, но запуск вашего кода точно так, как вы написали, дал мне желаемый ожидаемый результат. Протестировано на Node.js v6.9.2   -  person Diego ZoracKy    schedule 28.03.2017
comment
Я получаю [ "--[[\n * a\n * b\n * c\n--]]\nfunction name(x, y) {", "--[[\n * a\n * b\n * c\n--]]\nfunction name(x, y) {" ] - что вы ожидаете?   -  person Wiktor Stribiżew    schedule 28.03.2017


Ответы (1)


[^] — ошибка в регулярном выражении.

Причина в том, что он не определен.
Отрицательный класс должен иметь что-то, что можно отрицать, иначе он не имеет смысла.

Если JS не выдает ошибку, поведение непредсказуемо.

Вместо этого вы должны использовать [\S\s], потому что это соответствует любому символу.

Кроме того, причина того, что он не соответствует последней строке в вашем производственном JS
, заключается в том, что вы разрешаете использовать только один пробел \s перед строкой.
Поскольку последняя строка не является обязательной, пробел соответствует CR в CRLF< br> пара (в ОС MS).

Чтобы это исправить, сделайте его открытым \s+.
Кроме того, первые два \s не нужны, так как вы сопоставляете любой символ между [[ ]]

Окончательное регулярное выражение теперь будет выглядеть так: https://regex101.com/r/7yjQCS/4
, который работает на любой платформе.

--\[\[([\S\s]*?)--\]\]\s+(.*)

person Community    schedule 28.03.2017