为啥 .replace() 不能处理从 escodege.generate() 生成的大字符串?

Posted

技术标签:

【中文标题】为啥 .replace() 不能处理从 escodege.generate() 生成的大字符串?【英文标题】:Why isn't .replace() working on a large generated string from escodege.generate()?为什么 .replace() 不能处理从 escodege.generate() 生成的大字符串? 【发布时间】:2018-04-02 17:17:54 【问题描述】:

我正在尝试使用 escodegen 的 .generate() function 生成一些代码,它给了我一个字符串。

不幸的是,它并没有完全删除分号(仅在代码块上),这是我自己需要它来摆脱它们的。所以我使用了.replace() 函数,但是由于某种原因没有删除分号。

这是我目前拥有的:

  generatedCode = escodegen.generate(esprima.parseModule(code), escodegenOptions)
  const cleanGeneratedCode = generatedFile.replace(';', '')
  console.log('cleanGeneratedCode ', cleanGeneratedCode) // string stays the exact same.

我是不是做错了什么或者错过了什么?

【问题讨论】:

它可能正在删除单个分号。尝试使用generatedFile.replace(/;/g, ''),而不是使用子字符串。 谢谢!这正是我所需要的(应该更清楚......)。将其作为答案,以便我可以将其标记为问题的解决方案:) 使用正则表达式替换所有:generatedFile.replace(new RegExp(';', 'g'), ''); @mscdeveloper 我以前从未见过。当一个特定的字符遍布整个字符串时,它肯定会让将来更容易使用。感谢您的建议! 【参考方案1】:

根据MDN,如果您提供子字符串而不是正则表达式

它被视为逐字字符串,不被解释为正则表达式。只会替换第一个匹配项。

因此,输出可能与生成的代码完全不一样,而是第一个分号已被删除。要解决这个问题,只需使用带有“全局”标志 (g) 的正则表达式。一个例子:

const cleanGenereatedCode = escodegen.generate(esprima.parseModule(code), escodegenOptions).replace(/;/g, '');
console.log('Clean generated code: ', cleanGeneratedCode);

【讨论】:

以上是关于为啥 .replace() 不能处理从 escodege.generate() 生成的大字符串?的主要内容,如果未能解决你的问题,请参考以下文章

java中的string类中内容一旦被初始化就不能改变为啥还有replace方法呢?

为啥 HAVING 和 GROUP_CONCAT 在此查询中不能一起工作?

为啥不能从 Kivy 终止这个 Python 多处理进程?

为啥不能提供从一个处理器到另一个处理器的缓存的直接访问?

为啥我不能使用 jQuery 从卸载事件处理程序触发 AJAX 请求?

为啥我不能从我的 java 程序运行批处理命令? [复制]