在JavaScript中捕获嵌套表达式

橙子

我正在尝试解析(1 < 2 ? foo : bar)JavaScript中的表达式(类似于速记if-then-else表达式)以提取条件部分(1 < 2),然后部分(foo)和其他部分(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"

但是正则表达式不尊重表达式的嵌套结构。有没有办法做到这一点?

洛基模拟人生

我不认为有一种方法可以使用正则表达式一次完成所有操作,但是您可以从嵌套最多的匹配项开始,然后逐层向外扩展。

我将正则表达式更改为仅匹配最嵌套的匹配项,然后,一旦读取了它们的数据,便从中删除匹配项,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]);
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章