我需要捕获等号:(test1)=(test2)
之间的两个匹配,以便match1 = test1和match2 = test2。到目前为止,我已经能够使用/([sS)(]*?)/gmi
,这主要是有效的,除非在等号的两侧有一个额外的父括号,即:(test1)=(te)st2)。
我可以创建什么样的正则表达式,使我能够成功地得到以下两个匹配:
"(test1)=(tes=)t2)".match( /([sS)(]*?)/gmi ) === ["test1", "tes=)t2"]
对于问题中的示例,如果支持使用查找,则可以断言右括号不能包含=
或)
。
请注意,您可以省略/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"]));