正则表达式对 javascript 块注释执行全局匹配

Regex to perform global match on javascript block comments

注意,这里的目标不是词法分析,所以请不要建议词法分析或解析代码。而且,我为增加 "regex comments" 问题的混乱而道歉,但最好的(投票最多的)bad answer(考虑到如何根据问题使用结果的上下文)是不够的,(尽管我能够从那里开始)并且我评论过的许多其他答案与我正在尝试做的事情完全无关。

我构建了一个正则表达式,它在原则上按预期工作 here


/(?:\n|^)(?:[^'"])*?(?:'(?:[^\\r\n]|[\]{2}|\')*'|"(?:[^\\r\n]|[\]{2}|\")*")*?(?:[^'"])*?(\/\*(?:[\s\S]*?)\*\/)/g

最后一组匹配块注释很好,参考上面SO:

(\/\*(?:[\s\S]*?)\*\/)

实际匹配之前的所有内容都被丢弃,但用于匹配有效块注释的目的 - 即不是在字符串文字中找到的内容。

忽略正则表达式看起来像块注释的情况。

假设输入字符串是 lint,而不是自由格式 javascript。


但是 in practice,我在第一场比赛中得到了重复,而没有其他比赛。

为什么?以及如何在实践中纠正它?

在此先感谢您的帮助,这个问题可能会给您带来任何麻烦。 :)

此外(在评论部分)欢迎任何潜在的陷阱,鉴于以下信息。

与直接问题无关的额外信息: 正如示例代码中所暗示的,最终目标是 replace/collapse 任何嵌套或其他代码结构,以便专注于给定代码补丁的词法范围顶部的变量声明 -为了提升变量声明,为特定用例生成模板。我知道这听起来像是一个负担,但我相信这是可能的并且相对简单 - 不完全是简单的更换 - 但 none 更少。为了参考我所说的 "possible" 的意思,我宁愿只折叠正则表达式、块注释和内联注释 EDIT: 和字符串文字 /EDIT,然后递归地折叠 {blocks} 中的变量范围(或普通对象)(所有不包含任何嵌套块的)直到它们消失,然后看看剩下的是什么。如果出于任何原因这似乎不起作用,请仅在评论中回复。谢谢!

这是 "ugh, yeah, of course!" 时刻之一。

exec()函数会生成一个有1个元素的数组,即匹配元素。除了没有,第一个元素是完全匹配,这很好除非有捕获组。如果有,那么除了 result[0] 是完整模式匹配之外,result[1] 将是第一个捕获组,result[2] 第二个,依此类推。

例如:

  1. (/l/g).exec("l") 给我们 ["l"]
  2. (/(l)/g).exec("l") 给我们 ["l", "l"]

你的 RE 并不是什么大问题(尽管 运行 通过流过滤器去除块注释的字符串可能更容易使用)因为它更多的是假设你可以只需在 exec 结果上使用 .join() 就可以解决问题。如果您有捕获组,并且有结果,请加入 results.slice(1),或在加入前调用 results.splice(1,0) 以删除前导元素,这样您就不会不小心包含完整匹配项。