我正在尝试创建一个.NET Regex,它将匹配VB.NET源代码中的引用字符串,但不包括某些不需要的字符串,例如XML注释和区域标签中的字符串等。
这是一个数据样本,代表Regex可能执行的一些VB.NET源代码:
#Region "Class Constructors"
''' <summary>
''' Initializes a new instance of the <see cref="MyClass" /> class.
''' </summary>
Public Sub New()
Debug.WriteLine("This string should be matched by the Regex")
End Sub
#End Region
正则表达式应匹配Debug.WriteLine
方法调用中的引用字符串,但应忽略区域标签和XML注释中的字符串。它还应支持VB.NET的引用转义语法,该语法使用两个连续的双引号来表示嵌入(转义)引号字符:
"This is a string containing an escaped quote "" character"
作为一个起点,我已尝试使用以下正则表达式,但负面的后观使其与后续的结束引号相匹配,就好像它们是打开引号一样。
(?<!Region\s+)"(?<Literal>(?:[^"]|"")*)"
作为一个额外的技巧,如果正则表达式可以完全忽略由一对引号字符表示的空字符串,将会有所帮助。
有什么建议吗?
提前致谢, 蒂姆
答案 0 :(得分:1)
我认为这是单个正则表达式无法解决所有问题的情况之一。我假设#Region指令可以是多行的,如:
#Region \
"MyRegion"
或者可能还有其他一些换行符,所以你的后视是不够的。有选择地从具有复杂语法的文本中提取匹配需要词法分析器,或者您应该以不同方式解析整个事物。 但是,您可以找到一个快捷方式,例如,您知道标签之间不需要任何内容&lt; summary&gt;和&lt; / summary&gt;,所以你可以循环遍历每一行并跳过过去的所有内容&lt; summary&gt;直到找到结束标记,然后您可以恢复字符串的匹配。 您应该特别注意编写正则表达式来删除注释和预处理程序指令(即:',#和REM)。请注意,这些关键字在不在字符串中时都是有效的,因此有点涉及剥离注释。即使在那里,一个正则表达式可能还不够。 对于删除双引号,这似乎对我有用:
"((?:[^"]|"")+)"