所以我需要一个正则表达式来查找单行和多行注释,但不能在字符串中。 (例如"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
答案 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)
我会使用两个正则表达式:
/(\/\*.*?\/)|(#.+?$)/m
找到所有评论,“m”修饰符是启用多行/"[^"]*?"/
找到所有字符串如果您首先将突出显示应用于注释,并且仅在字符串之后应用,则无效注释应该消失。