Как я могу использовать регулярное выражение для получения совпадений по обе стороны знака равенства для строки (test1)=(tes=)t2)

#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"]));