正则表达式对 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]
第二个,依此类推。
例如:
(/l/g).exec("l")
给我们 ["l"]
(/(l)/g).exec("l")
给我们 ["l", "l"]
你的 RE 并不是什么大问题(尽管 运行 通过流过滤器去除块注释的字符串可能更容易使用)因为它更多的是假设你可以只需在 exec
结果上使用 .join()
就可以解决问题。如果您有捕获组,并且有结果,请加入 results.slice(1)
,或在加入前调用 results.splice(1,0)
以删除前导元素,这样您就不会不小心包含完整匹配项。
注意,这里的目标不是词法分析,所以请不要建议词法分析或解析代码。而且,我为增加 "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]
第二个,依此类推。
例如:
(/l/g).exec("l")
给我们["l"]
(/(l)/g).exec("l")
给我们["l", "l"]
你的 RE 并不是什么大问题(尽管 运行 通过流过滤器去除块注释的字符串可能更容易使用)因为它更多的是假设你可以只需在 exec
结果上使用 .join()
就可以解决问题。如果您有捕获组,并且有结果,请加入 results.slice(1)
,或在加入前调用 results.splice(1,0)
以删除前导元素,这样您就不会不小心包含完整匹配项。