0

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

我已经建立了一个正则表达式,它原则上按这里预期的那样工作。


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

最后一组与块注释很好地匹配,如上述 SO 中的引用:

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

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

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

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


在实践中,我在第一场比赛中得到了重复,而没有其他比赛。

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

在此先感谢您的帮助以及问题可能给您带来的任何麻烦。:)

此外(在评论部分)欢迎任何潜在的坑跌落,给出以下信息。

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

4

1 回答 1

1

这是其中之一“呃,是的,当然!” 时刻。

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

例如:

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

您的 RE 不是问题(尽管通过流过滤器运行字符串以取出块注释可能更容易使用),因为它更多的是假设您可以仅在导致您.join()的结果上使用的情况exec问题。如果您有捕获组,并且有结果,请 joinresults.slice(1)results.splice(1,0)在加入前调用以摆脱领先元素,这样您就不会意外包含完整匹配项。

于 2015-07-07T01:32:02.970 回答