正则表达式用于注释但不在"字符串"内/不在另一个容器中

2 regex comments match regex-negation

所以我需要一个正则表达式来查找单行和多行注释,但不是在字符串中.(例如"my /* string")

用于测试(#单线/**/多线):

# complete line should be found
lorem ipsum # from this to line end
/*
  all three lines should be found
*/ but not here anymore
var x = "this # should not be found"
var y = "this /* shouldn't */ match either"
var z = "but" & /* this must match */ "_"
Run Code Online (Sandbox Code Playgroud)

所以语法显示真的很好; 我基本上想要所有的灰色文字.
我不在乎它是单个正则表达式还是两个正则表达式.;)

编辑:还有一件事.相反的也会满足我,搜索一个不在注释中的
字符串这是我当前的字符串匹配:( "[\s\S]*?(?<!\\)"确实:将无法使用"\\")

EDIT2:
好的,最后我写了自己的评论解析器-.-
如果其他人对源代码感兴趣,请从这里抓取它:https://github.com/relikd/CommentParser

mat*_*fee 6

这是一种可能性(它确实有一个阿基里斯的脚跟,我会得到):

(#[^"\n\r]*(?:"[^"\n\r]*"[^"\n\r]*)*[\r\n]|/\*([^*]|\*(?!/))*?\*/)(?=[^"]*(?:"[^"]*"[^"]*)*$)
Run Code Online (Sandbox Code Playgroud)

这里行动

使用GLOBAL和DOTALL标志,但不是 MULTILINE标志.

正则表达式的解释:

(
  #[^"\n\r]*                         Hash mark followed by non-" and non-end-of-line
    (?:"[^"\n\r]*"[^"\n\r]*)*        If any quotes in the comment, they must be balanced
    [\r\n]                           Followed by end-of-line ($ except we 
                                      don't have multiline flag)

  |                                  OR
  /\*([^*]|\*(?!/))*?\*/             /* xxx */ sort of comment
  )                                  BOTH FOLLOWED BY
(?=[^"]*(?:"[^"]*"[^"]*)*$)           only a *balanced* number of quotes for the 
                                      *rest of the code :O!*
Run Code Online (Sandbox Code Playgroud)

但是,这依赖于整个文本中使用的平衡引号(它也没有考虑转义引号,但是很容易修改正则表达式以考虑到这一点).

如果一个用户的评论中有一个"不平衡的话......繁荣.你被搞砸了!

HTML /代码解析之类的东西通常不推荐使用正则表达式,但是如果你可以依赖于在定义字符串等时引号必须平衡的事实,你有时可以使用它.

既然你也分析评论,其中有没有固定的结构(即你不能保证在注释中的报价将是平衡的),你将无法找到在这里工作正则表达式的解决方案.

你想到的任何东西都可以通过某个地方的评论中的不平衡报价(比如说评论# remove all the " marks)或者多行字符串(在给定行上可能存在不平衡报价)来证明.

底线 - 您可以制作一个在大多数情况下都能正常运行的正则表达式,但并非适用于所有情况.要获得不透水的东西,你必须编写一些代码.