#javascript #regex
Вопрос:
Мне нужно зафиксировать два совпадения между знаком равенства: (test1)=(test2)
такое, чтобы match1 = test1 и match2 = test2. До сих пор мне удавалось использовать /([sS)(]*?)/gmi
то, что в основном работает, ЕСЛИ только по обе стороны знака равенства нет дополнительного близкого родителя, т. Е.: (test1)=(te)st2).
Какое регулярное выражение я мог бы создать, которое позволило бы мне успешно завершить двумя совпадениями, учитывая приведенное ниже:
"(test1)=(tes=)t2)".match( /([sS)(]*?)/gmi ) === ["test1", "tes=)t2"]
Ответ №1:
Для примеров в вопросе и при поддержке с помощью обходных путей вы можете утверждать, что закрывающая скобка не может содержать =
или )
справа.
Обратите внимание, что вы можете опустить /m
флаг, так как в шаблоне нет якорей, и вы также можете опустить /i
флаг, так как шаблон специально не соответствует символам верхнего или нижнего регистра.
let regex = /(?<=().*?(?=)(?![^s=)]))/g;
let str = "(test1)=(tes=)t2)";
console.log(str.match(regex));
Или использование группы захвата без предварительного утверждения:
let regex = /((.*?))(?![^s=])/g;
let str = "(test1)=(tes=)t2)";
const result = Array.from(str.matchAll(regex), m => m[1]);
console.log(JSON.stringify(result) === JSON.stringify(["test1", "tes=)t2"]));