我正在尝试解析JavaScript中的(1 < 2 ? foo : bar)等表达式(类似于速记if-then-else表达式),以提取条件部分(1 < 2)、then部分(foo)和else部分(bar)。我使用的正则表达式适用于简单表达式,但是当我试图解析嵌套表达式时,正则表达式失败。
正则表达式:/\((.*)\?([^:]*)(:.*)?\)/
简单的例子:
/\((.*)\?([^:]*)(:.*)?\)/.exec('dsa dsadsa dsa(1 < 2 ? foo : bar) dsa dsa dsa')
0: "(1 < 2 ? foo : bar)"
1: "1 < 2 "
2: " foo "
3: ": bar"嵌套示例((H < 12 ? (m > 30 ? foo : bar) : baz))):
/\((.*)\?([^:]*)(:.*)?\)/.exec('dsa dsadsa dsa(H < 12 ? (m > 30 ? foo : bar) : baz)) dsa dsa dsa')
0: "(H < 12 ? (m > 30 ? foo : bar) : baz))"
1: "H < 12 ? (m > 30 "
2: " foo "
3: ": bar) : baz)"我真正想要的嵌套示例的结果是
1: "H < 12"
2: "(m > 30 ? foo : bar)"
3: ": baz"但是正则表达式没有考虑表达式的嵌套结构。有没有办法做到这一点?
发布于 2020-10-30 09:55:01
我不认为有一种方法可以使用正则表达式一次性完成所有这些工作,但您可以从最嵌套的匹配开始,然后逐步向外扩展。
我已经将正则表达式更改为只匹配嵌套最多的匹配项,然后,一旦读取了它们的数据,我就从str中删除匹配项并再次运行正则表达式,以获得下一个嵌套最多的层,并重复执行,直到所有层都被读取。
let str = 'dsa dsadsa dsa(H < 12 ? (m > 30 ? foo : bar) : baz)) dsa dsa dsa';
const regex = /\(([^?]+)\?([^:()]*):([^()]+)?\)/;
const list = [];
let matches = regex.exec(str);
let loopLimit = 1000;
while (matches) {
if (loopLimit-- <= 0) throw 'loopLimit exhausted';
str = str.replace(matches[0], `~list[${list.length}]~`);
list.push(matches);
matches = regex.exec(str);
}
console.log(list);
for (let item of list) {
console.log(item[1]);
}
发布于 2020-10-30 11:40:09
https://stackoverflow.com/questions/64601409
复制相似问题