【问题标题】:Parse JS expression from a string从字符串中解析 JS 表达式
【发布时间】:2018-04-25 20:22:22
【问题描述】:

给定一个字符串,例如(这是一个 javascript 源文件):

"...attr1: i, TARGET: <JS_EXPRESSION>, attr3: {..."

如何使用已知的TARGET 键解析 Javascript 表达式?

JS 表达式可以任意复杂并包含逗号,所以看起来正则表达式除了找到初始目标键 TARGET 之外不会做任何事情。周围的代码也可以包含任意的 JS 代码。

这是我试图证明这不是家庭作业:

return source.replace(/TARGET: ([^,]*),/g, function(a, b){
  return operationOnExpression(b);
});

但这在&lt;E&gt; 的更复杂情况下会失败,例如console.log('hi', 'there');

【问题讨论】:

  • 然后呢?您是否尝试过自己解决问题?您能否在您的问题中添加minimal reproducible example,以突出显示您尝试过的内容和无效的内容?
  • 完整的字符串是什么样的?也许是 JSON?
  • 如果TARGET前后可以出现任意代码,则无法解析
  • @Luca 我无法提供一个最小的示例,因为我正在构建一个 webpack 加载器。这是我能提出的最简单的问题。我需要一种方法来解析这个值
  • 看起来像XY Problem

标签: javascript compiler-construction


【解决方案1】:

您可以使用几个拆分来提取表达式并创建一个包含该表达式的脚本标记并将其附加到head

const str = "...attr1: i, TARGET: console.log('here', 1), attr3: {..."

const exp = str.split('TARGET')[1].split(',').slice(0, -1).join().slice(1)

const script = document.createElement('script');
script.text = exp;

document.getElementsByTagName('head')[0].appendChild(script);

【讨论】:

  • 这失败了,当TARGETconsole.log('here', 'there'),因此它不符合要求
  • @Taki,谢谢你的回答,但是如果你传递了console.log('here', 1) 之类的东西,那么这就是我的问题!
  • @Luca 这并不完美,这只是一个例子,但目标是让他知道该做什么,他可以安排他获得表达的方式。
  • 很好,似乎已经做到了。至少对于这个字符串。正如我在评论中所写,如果TARGET 之前和之后可以出现任意代码,则无法解析它
  • @Taki 你真聪明:)
【解决方案2】:

如果 TARGET 列左侧的值不能包含逗号,您可以使用它们,向前搜索下一个逗号,直到您看到正确数量的“列”或者您看到“TARGET”作为下一列的开始。右侧的列相同。在 Javascript 中,您可以重复使用 substrindexOf 来执行此操作。

如果这样不好,请提供更多信息,例如您使用的语言、您已经尝试过的事情、JS 表达式是否被引号包围。

【讨论】:

  • 我已经更新了我的问题以反映。该字符串是一个完整的、有效的 JS 文件。我是用JS来解析的。
  • 一个 webpack 加载器?整洁的。我看不到任何方法可以在其他数据中间的一个“列”中可靠地解析任意 JS,而无需基本上解析其他所有内容,然后解析剩下的目标。不要以为您可以链接到任何描述您正在处理的格式的文档?它是标准的 webpack 吗?
猜你喜欢
  • 1970-01-01
  • 2021-10-05
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-22
  • 1970-01-01
相关资源
最近更新 更多