Regex 正则表达式捕获VBA注释

Regex 正则表达式捕获VBA注释,regex,vba,Regex,Vba,我正在尝试捕获VBA注释。到目前为止,我有以下几点 '[^";]+\Z 它捕获以单引号开头但在字符串结尾之前不包含任何双引号的任何内容。i、 e.它将不匹配双引号字符串中的单引号 dim s as string ' a string variable -- works s = "the cat's hat" ' quote within string -- works 但如果注释包含双引号字符串,则失败 i、 e 我如何修复我的正则表达式来处理这个问题呢?中的模式(^

我正在尝试捕获VBA注释。到目前为止,我有以下几点

'[^";]+\Z
它捕获以单引号开头但在字符串结尾之前不包含任何双引号的任何内容。i、 e.它将不匹配双引号字符串中的单引号

dim s as string        ' a string variable   -- works
s = "the cat's hat"    ' quote within string -- works
但如果注释包含双引号字符串,则失败

i、 e

我如何修复我的正则表达式来处理这个问题呢?

中的模式(
^\'[^\r\n]+$\'[^\r\n]+$
)甚至与您的任何测试样本都不匹配,并且链接的问题是无用的,其中的正则表达式将只匹配OP问题中的特定注释,而不是“VBA注释语法”

你想出的正则表达式比我放弃正则表达式时的效果更好

干得好

问题是不能用正则表达式解析VBA注释

在中,他很好地解释了乔姆斯基的语法水平:

3级:常规语法

它们使用正则表达式,也就是说,它们只能由 字母表的符号(a、b)及其连接(ab、aba、bbb等),或 备选方案(如a | b)。它们可以实现为有限状态 自动机(FSA),类似NFA(非确定性有限自动机)或更好 DFA(确定性有限自动机)常规语法无法处理 使用嵌套语法,例如正确嵌套/匹配的括号 (())、嵌套HTML/BBcode标记、嵌套块等。这是因为 处理它的状态自动机应该有无穷多个 处理无限多个嵌套级别的状态

第2级:上下文无关语法

它们的语法中可以有嵌套的、递归的、自相似的分支 树,因此它们可以很好地处理嵌套结构。他们可能是 实现为具有堆栈的状态自动机。此堆栈用于 表示语法的嵌套级别。实际上,它们是 通常作为自顶向下的递归下降解析器实现,该解析器使用 机器的过程调用堆栈来跟踪嵌套级别,并使用 每个非终端符号的递归调用过程/函数 在它们的语法中。但他们无法处理上下文敏感的问题 语法。例如,当你有一个表达式x+3,在一个上下文中,这个表达式是x 可以是变量的名称,在其他上下文中可以是名称 函数等的定义

第1级:上下文相关语法

正则表达式根本不是解决此问题的合适工具,因为每当有多个单引号(/撇号)或涉及双引号时,您需要确定代码行中最左边的撇号是否在双引号内,如果在双引号内,然后您需要匹配双引号,并在结束双引号后找到最左边的撇号-实际上,最左边的撇号不是字符串文字的一部分,是您的注释标记

我的理解是VBA注释语法是一种上下文敏感语法(第1级),因为撇号只是您的标记,如果它不是字符串文字的一部分,那么要确定撇号是否是字符串文字的一部分,最简单的方法可能是从左向右移动字符串,并在遇到双引号时切换一些
IsInsideQuote
标志。。。但前提是他们没有逃脱(加倍)。实际上,您甚至不检查字符串litereal中是否有撇号:您只需一直走到打开的引号关闭为止,并且只有当“in quotes标志”为
False
时,如果遇到单个引号,您才能找到注释标记

祝你好运


以下是您缺少的一个测试用例:

s = "abc'def ""xyz""'nutz!" 'string with apostrophes and escaped double quotes
如果您不关心捕获字符串文本,只需忽略转义的双引号,并在此处查看3个字符串文本:
“abc'def”
“xyz”
“nutz!”


此C#代码输出带有撇号和转义双引号的
”字符串(所有字符串中的双引号在代码中用反斜杠转义),并与我提供的所有测试字符串一起工作:

static void Main(字符串[]args)
{
var instruction=“s=\”abc'def\“\”xyz\“\”nutz!\“'带撇号和转义双引号的字符串”;
//var instruction=“s=\”猫的帽子\“字符串中的引号——有效”;
//var instruction=“dim s as string”字符串应设置为“十”;
int?commentStart=null;
var isInsideQuotes=false;
for(变量i=0;i

如果您想捕获所有的法律评论,您需要处理遗留<代码> REM关键字,并考虑行继承:

Rem this is a legal comment
' this _
    is also _
    a legal comment
换句话说,
\r\n
本身不足以正确识别所有语句结束标记


正确的lexer+解析器似乎是捕获所有注释的唯一方法。

[重复问题?][1][1]:尝试
^\'[^\r\n]+$\'[^\r\n]+$
Rem this is a legal comment
' this _
    is also _
    a legal comment