Regex对javascript块注释执行全局匹配



注意,这里的目标不是词法分析,所以请不要建议对代码进行词法分析或解析。而且,我为添加了"正则表达式评论"问题而道歉,但最好(投票最多(的坏答案(考虑到如何根据问题使用结果的上下文(是不够的(尽管我能够从那里开始(,我审查的许多其他答案与我试图做的事情根本无关。

我已经构建了一个正则表达式,它在原理上与这里预期的一样工作。


/(?:n|^)(?:[^'"])*?(?:'(?:[^\rn]|[\]{2}|\')*'|"(?:[^\rn]|[\]{2}|\")*")*?(?:[^'"])*?(/*(?:[sS]*?)*/)/g

最后一组很好地匹配块注释,如以上SO:中的参考

(/*(?:[sS]*?)*/)

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

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

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


但在练习中,我在第一场比赛中得到了一个副本,而在其他比赛中没有。

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

提前感谢您的帮助以及这个问题可能给您带来的任何麻烦。:(

此外(在评论部分(根据以下信息,欢迎任何潜在的坑落。

与直接问题无关的额外信息:正如示例代码中所暗示的,最终目标是替换/折叠任何嵌套或其他代码结构,以便关注给定代码补丁的词法范围顶部的变量声明,以便提升变量声明,为特定用例生成模板。我知道这听起来像是一种负担,但我相信这是可能的,而且相对来说是直接的——不是完全通过简单的更换——但无论如何。对于我所说的"可能",我更喜欢只折叠regexs、块注释和内联注释EDIT:和字符串文字/EDIT,然后递归地只折叠{block}中的变量作用域(或普通对象((所有这些都不包含任何嵌套块(,直到它们消失,然后看看剩下什么。如果出于任何原因,这似乎都不起作用,请只在评论中回应。非常感谢。

这是其中一个"哦,是的,当然!"的时刻。

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)以去掉前导元素,这样就不会意外地包含完全匹配。

相关内容

  • 没有找到相关文章

最新更新