首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >捕获JavaScript中的嵌套表达式

捕获JavaScript中的嵌套表达式
EN

Stack Overflow用户
提问于 2020-10-30 09:10:54
回答 2查看 76关注 0票数 1

我正在尝试解析JavaScript中的(1 < 2 ? foo : bar)等表达式(类似于速记if-then-else表达式),以提取条件部分(1 < 2)、then部分(foo)和else部分(bar)。我使用的正则表达式适用于简单表达式,但是当我试图解析嵌套表达式时,正则表达式失败。

正则表达式:/\((.*)\?([^:]*)(:.*)?\)/

简单的例子:

代码语言:javascript
复制
/\((.*)\?([^:]*)(:.*)?\)/.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))):

代码语言:javascript
复制
/\((.*)\?([^:]*)(:.*)?\)/.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)"

我真正想要的嵌套示例的结果是

代码语言:javascript
复制
1: "H < 12"
2: "(m > 30 ? foo : bar)"
3: ": baz"

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-10-30 09:55:01

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

我已经将正则表达式更改为只匹配嵌套最多的匹配项,然后,一旦读取了它们的数据,我就从str中删除匹配项并再次运行正则表达式,以获得下一个嵌套最多的层,并重复执行,直到所有层都被读取。

代码语言:javascript
复制
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]);
}

票数 0
EN

Stack Overflow用户

发布于 2020-10-30 11:40:09

我想你可以试试

代码语言:javascript
复制
\((.*?)\?(\(?.*\)?)?:(\(?.*\)?)?\)

Demo

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64601409

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档