删除JavaScript注释的综合RegExp
我需要用一个正则表达式可靠地删除所有JavaScript注释 我搜索过StackOverflow和其他网站,但没有一个考虑到交替引号、多行注释、字符串内注释、正则表达式等 是否有任何正则表达式可以从中删除注释:删除JavaScript注释的综合RegExp,javascript,regex,Javascript,Regex,我需要用一个正则表达式可靠地删除所有JavaScript注释 我搜索过StackOverflow和其他网站,但没有一个考虑到交替引号、多行注释、字符串内注释、正则表达式等 是否有任何正则表达式可以从中删除注释: var测试=[ “//代码”, “//代码”, “//代码”, “//代码”, //“评论”, //“评论”, /*评论*/ //评论/*评论 /*评论 注释//*/“代码”, “代码”, “/*代码*/”, “/*代码”, “代码*/”, “/*代码*/”, “/*代码”, “代码*/
var测试=[
“//代码”,
“//代码”,
“//代码”,
“//代码”,
//“评论”,
//“评论”,
/*评论*/
//评论/*评论
/*评论
注释//*/“代码”,
“代码”,
“/*代码*/”,
“/*代码”,
“代码*/”,
“/*代码*/”,
“/*代码”,
“代码*/”,
/*评论
“评论”,
注释*/“代码”,
/代码\/*/,
“代码*/”
]
这里有一个or来测试它。测试。替换(/(/*([\s\s]?)*/)|(//($)/gm',);我建议您考虑使用JavaScript解析器本身解析JavaScript,然后利用解析器API剥离您不想要的内容。我个人没有这样做,但正则表达式应该限于正则内容,我怀疑JS是否属于正则内容 这里有一些好地方可以看
首先,我建议使用合适的JavaScript解析器来执行此操作。请查看前面的问答: 对于您提供的输入1,以下是一个可能有效的解决方案: 匹配模式:
/("(?:[^\r\n\\"]|\\.)*"|'(?:[^\r\n\\']|\\.)*'|\/[^*\/]([^\\\/]|\\.)*\/[gm]*)|\/\/[^\r\n]*|\/\*[\s\S]*?\*\//g
/
( # start match group 1
"(?:[^\r\n\\"]|\\.)*" # match a double quoted string
| '(?:[^\r\n\\']|\\.)*' # match a single quoted string
| \/[^*\/]([^\\\/]|\\.)*\/[gm]* # match a regex literal
) # end match group 1
| \/\/[^\r\n]* # match a single line break
| \/\*[\s\S]*?\*\/ # match a multi-line break
/g
下面是对模式的分解:
/("(?:[^\r\n\\"]|\\.)*"|'(?:[^\r\n\\']|\\.)*'|\/[^*\/]([^\\\/]|\\.)*\/[gm]*)|\/\/[^\r\n]*|\/\*[\s\S]*?\*\//g
/
( # start match group 1
"(?:[^\r\n\\"]|\\.)*" # match a double quoted string
| '(?:[^\r\n\\']|\\.)*' # match a single quoted string
| \/[^*\/]([^\\\/]|\\.)*\/[gm]* # match a regex literal
) # end match group 1
| \/\/[^\r\n]* # match a single line break
| \/\*[\s\S]*?\*\/ # match a multi-line break
/g
然后将其替换为$1
(匹配组1)。这里的诀窍是,除了注释之外的任何内容都在组1中匹配,这些注释会再次被替换为自身,但注释会被替换为空字符串
下面是一个演示,演示了以下替换:
var test = [
"// Code",
'// Code',
"'// Code",
'"// Code',
"Code",
"Code",
"/* Code */",
"/* Code",
"Code */",
'/* Code */',
'/* Code',
'Code */',
"Code",
/Code\/*/,
"Code */"
]
1同样,解析器是一种方法,因为正则表达式文字可能与除法运算符混淆。如果在源代码中有类似var x=a/b/g;
的赋值,上述解决方案将失败
有没有可以删除注释的正则表达式
不可以。您不能构建与注释匹配的正则表达式(这样您就可以简单地用空字符串替换匹配),因为如果不进行查找,就无法确定/“
是注释还是字符串文字的结尾
您可以使用正则表达式作为标记器(您“只”需要处理字符串文本、正则表达式文本和两种类型的注释),但我建议使用成熟的JavaScript解析器,它们是免费提供的。我喜欢挑战:)
以下是我的工作解决方案:
/([“'))(?:\[\s\s].*?\2\/(?![*\/])(?:\.\.\[(?:\.\124;)\].*?\/)\/.*?$\/.*[\ s\s].*?:\\.\/.*/.$\124\/\*.[\ s\s].*?\*///gm
将其替换为$1
在这里拉小提琴:
当然,正如已经无数次指出的,一个合适的解析器可能会更好,但仍然
注:我在小提琴中使用了正则表达式文字而不是正则表达式字符串,太多的逃逸会破坏你的大脑
崩溃
(([“'))(?:\[\s\s].*?\2.\/(?![*\/])(?:\.\.\[(?:\.\124;)\].*?\/)你呢?为什么?这个要求的背景是什么?您是否尝试过?是否尝试过创建所述正则表达式?如果是的话,把它贴在这里。但是请注意,仅使用正则表达式可能不容易实现此任务。最好的做法是使用真正的JavaScript解析器。到目前为止,我找到的最好的正则表达式是:/(?:\/*(?:[\s]*?)*\/)|(?:([\s;])+\/\/(?:*)/gm+1,用于高质量的小提琴。。。但是/Comment/gm
有效:PSyntaxError:Unexpected token illegal您似乎很清楚这方面的问题-为什么还要建议使用正则表达式?这在很多情况下都是失败的。@BenjaminGruenbaum,为了好玩:)固体反驳:)看起来确实很有趣,你可能想建议esprima和escodegen做一些更理智的东西,你可以用来删除一行中的注释。@BenjaminGruenbaum,我不愿意推荐特定的JS解析器,因为我对它们都没有个人经验。但我可以发表一篇关于JS解析器的问答。为什么单引号的字符串可以包含换行符,而双引号的字符串不能?(顺便说一句,
与转义换行符不匹配)。另外,/[/]/
是一个有效的正则表达式。值得一提的是,我非常确定字符串中的注释是一种正则语言,因为它们不能嵌套。我不相信第一个“否”,我非常确定是否可以确定//“
是注释或字符串文字的结尾,具体取决于您在正则表达式中的位置。此外,直觉上,因为你只有有限的东西可以保存,这应该是正常的,我当然可以想象一个DFA。你的第二段很贴切,我指的是一个只匹配注释的正则表达式,这似乎是不可能的。当然,有了捕获组和一个智能替换器功能,可以对注释进行排序,但保留文字(类似于BartKiers所做的),这是可以做到的。我将编辑答案以提供详细的细分,但现在,这意味着:匹配转义字符或未转义字符,而不捕获它。否<代码>\。
仅匹配一个点。此外,转义字符可以是换行符,而非转义字符不能是反斜杠或分隔符。@Bergi哎呀,当然是\。
,谢谢。但是在JS中,
与换行符不匹配,
与反斜杠不匹配,因为第一个alternative@Bergi否,
不应与换行符匹配,除非设置了s
修饰符。这个修饰符在JS中不存在(参见答案底部的注释)。孤独的
在这里不是问题。另外,为/[/]/
正则表达式模式添加了案例,感谢您指出这一点