Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
删除JavaScript注释的综合RegExp_Javascript_Regex - Fatal编程技术网

删除JavaScript注释的综合RegExp

删除JavaScript注释的综合RegExp,javascript,regex,Javascript,Regex,我需要用一个正则表达式可靠地删除所有JavaScript注释 我搜索过StackOverflow和其他网站,但没有一个考虑到交替引号、多行注释、字符串内注释、正则表达式等 是否有任何正则表达式可以从中删除注释: var测试=[ “//代码”, “//代码”, “//代码”, “//代码”, //“评论”, //“评论”, /*评论*/ //评论/*评论 /*评论 注释//*/“代码”, “代码”, “/*代码*/”, “/*代码”, “代码*/”, “/*代码*/”, “/*代码”, “代码*/

我需要用一个正则表达式可靠地删除所有JavaScript注释

我搜索过StackOverflow和其他网站,但没有一个考虑到交替引号、多行注释、字符串内注释、正则表达式等

是否有任何正则表达式可以从中删除注释:

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中不存在(参见答案底部的注释)。孤独的
在这里不是问题。另外,为
/[/]/
正则表达式模式添加了案例,感谢您指出这一点