使用RegEx

时间:2017-01-12 14:14:29

标签: regex vba comments

我正在尝试使用正则表达式查找所有VBA注释。我有一些主要有用的东西,但有一些我无法弄清楚的例外。

我正在使用的表达式:

'(?!.*").*

拿我们的测试代码:

Working - This is a test 'This should be captured
Working - "this is a test" 'This should be captured
Not Working - "this is a test" 'This should be "captured"
Not Working - This is a test 'This should be "captured"
Working - "this is a test 'this should not capture'" 'this should capture
Working - "this isn't a test" 'this should capture

以下是RegExr中此示例的链接:http://regexr.com/3f24h

出于某种原因,第三和第四个例子没有捕获。问题似乎是在评论中有一个字符串值,我无法弄清楚如何解决它。

有什么建议吗?

3 个答案:

答案 0 :(得分:5)

您无法在VBA代码中找到所有注释(更不用说字符串文字)和正则表达式 - 句点。相信我,我在Rubberduck的智能压头模块的工作中尝试过(如果不够明确 - 完全披露,我是贡献者)。您需要实际解析代码。您遇到的第一个问题是续行:

'Comment with a line _
continuation

Debug.Print 'End of line comment _
with line continuation.

Debug.Print 'Multiple line continuation operators _ _
still work.

Debug.Print 'This is actually *not* a line continuation_
Debug.Print 42

这使得识别字符串文字很困难,尤其是您使用逐行处理:

Debug.Print 42 'The next line... _
"...is not a string literal"

您还必须处理旧的Rem注释语法...

Rem old school comment

...也支持续行:

Rem old school comment with line _
continuation.

你可能在思考"那可能不是很糟糕,Rem必须开始行#34;如果是,您忘记了语句分隔符(:)...

Debug.Print 42: Rem statement separator comment.

...或其邪恶的双胞胎语句分隔符与行继续结合:

Debug.Print 42: Rem this can be _
continued too.

你解决了一些问题,包括整理字符串文字和这些评论......

Debug.Print "Unmatched double quotes." 'Comment"
Debug.Print "Interleaved single 'n double quotes." 'Comment"

...但是这个野兽的括号标识符怎么样(由@ThunderFrame提供)?

'No comments or strings in the line below.
Debug.Print [Evil:""Comment"'here] 

请注意,语法高亮显示器SO使用甚至无法捕获所有这些奇怪的角落案例。

答案 1 :(得分:2)

也许像

^(?:[^"'\n]*("(?:[^"\n]|"")*"))*[^"]*'(.*)$

它处理多个带引号的字符串,以及带引号(double)"的字符串(我相信这是VBA的方式)。

(我保证在某些情况下它会失败,但可能会在大多数情况下失效;)

Check it out here at regex101

修改

添加了Comintern的一些示例并调整了正则表达式。它仍然无法处理括号内的标识符(我甚至不知道它的含义:S见最后一行)。但它现在处理他继续的评论。

^(?:[^"'\n]*(?:"(?:[^"\n]|"")*"))*[^']*('(?:_\n|.)*)

Check it out here at regex101

答案 2 :(得分:0)

这应该有效:

("[^"]+"\s)?'.+

在这里测试:https://regex101.com/r/dd60QS/1