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

时间:2012-02-09 00:27:12

标签: 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 */ "_"

SO语法显示效果如何;我基本上都想要所有的灰色文字 我不在乎它是单个正则表达式还是两个正则表达式。 ;)

编辑:还有一件事。相反的也会让我满意,寻找一条不在评论中的字符串 这是我当前的字符串匹配:"[\s\S]*?(?<!\\)"(确实:不适用于"\\"

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

2 个答案:

答案 0 :(得分:6)

这是一种可能性(它确实有一个我会得到的跟腱):

(#[^"\n\r]*(?:"[^"\n\r]*"[^"\n\r]*)*[\r\n]|/\*([^*]|\*(?!/))*?\*/)(?=[^"]*(?:"[^"]*"[^"]*)*$)

行动here

使用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!*

但是,依赖于在整个文本中使用的均衡引号(它也没有考虑转义引号,但是很容易修改正则表达式以将其考虑在内)。< / p>

如果用户的评论中有“其中不平衡......繁荣。你被搞砸了!”

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

由于您还在解析没有设置结构的评论 (即您无法保证评论中的引号将被平衡),您将无法找到一个适用于此处的正则表达式解决方案。

你想到的任何事情都可能被某个评论中的不平衡报价(比如评论为# remove all the " marks)或多线字符串(在给定行上可能存在不平衡报价)所证实。

底线 - 您可以创建一个适用于大多数情况的正则表达式,但并非适用于所有情况。为了获得不透水的东西,你必须编写一些代码。

答案 1 :(得分:0)

我会使用两个正则表达式:

  1. /(\/\*.*?\/)|(#.+?$)/m找到所有评论,“m”修饰符是启用多行
  2. /"[^"]*?"/找到所有字符串
  3. 如果您首先将突出显示应用于注释,并且仅在字符串之后应用,则无效注释应该消失。