1

我正在尝试创建一个 .NET 正则表达式,它将匹配 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>(?:[^"]|"")*)"

作为一项额外的技巧,如果 Regex 可以完全忽略由一对引号字符表示的空字符串,那将会很有帮助。

请问有什么建议吗?

在此先感谢,蒂姆

4

1 回答 1

1

我认为这是单个正则表达式无法解决所有问题的情况之一。我假设#Region 指令可以是多行的,如下所示:

#Region \
  "MyRegion"

或者可能有其他换行符,所以你的后视是不够的。从具有复杂语法的文本中选择性地提取匹配项需要词法分析器,或者您应该以不同的方式解析整个内容。但是,您可能能够找到一个快捷方式,例如您知道您不需要标签 <summary> 和 </summary> 之间的任何内容,因此您可以遍历每一行并跳过 <summary> 之后的所有内容,直到找到结束标记,然后您可以继续匹配字符串。您应该特别注意编写正则表达式以去除注释和预处理器指令(即:'、# 和 REM)。请注意,当它们不在字符串中时,这些关键字都是有效的,因此剥离注释有点涉及。即使在那里,单个正则表达式可能还不够。对于删除双引号,

"((?:[^"]|"")+)"
于 2011-05-25T10:42:23.027 回答