正则表达式解析C#源代码以查找所有字符串

我很久以前就问过这个问题,我希望我已经阅读过如何在C#(或Java,C ++等)中不使用Regex的答案

我希望使用Regex(正则表达式)来获取C#源代码中所有字符串的列表,包括嵌入了双引号的字符串。

这应该不难,但是在我花时间尝试构建正则表达式之前,是否有人已经拥有“预制”的表达式?

这并不像第一次那样容易

  • “AV \” d”
  • @“A B C D”
  • @” AB”””
  • @””” AB”
  • 等等

我发布这个作为我的答案,所以它在其他人阅读问题时脱颖而出。

正如我在问题的有用评论中指出的那样,很明显正则表达式不是在C#代码中查找字符串的好工具。 在我提醒我自己的正则表达式语法时,我本可以编写一个简单的“解析器”。 – (Parser是一个过度声明,因为没有“在评论中等,这是我正在处理的源代码。)

这似乎总结得很好:

有些人在遇到问题时会想“我知道,我会使用 正则表达式。”现在他们有两个问题。

然而,在我的代码中断之前,我将使用Blixt发布的正则表达式,但如果它给我带来问题,我将不会花费匹配时间来尝试修复它,然后再编写我自己的解析器。 例如,它是一个C#字符串

@"@Q(?:[^Q]+|QQ)*Q|Q(?:[^Q\\]+|\\.)*Q".Replace('Q', '\"') 

更新,上面的regEx有问题,所以我只写了我自己的解析器,包括编写unit testing花了大约2个小时来编写解析器。 这比我在网上试图找到(并测试)预先制作的正则表达式的时间少得多。

我看到的问题是,我倾向于避免正则表达式,只是自己编写字符串处理代码,然后有很多人声称我通过不使用正则表达式来浪费客户的钱。 然而,每当我尝试使用正则表达式时,看似简单的匹配模式就会变得更加快速匹配。 (没有关于在我阅读的.net中使用Regex的在线文章,有一个很好的指令,在不使用正则表达式时明确说明。同样使用它的MSDN文档)

让我们看看我们是否可以帮助解决这个问题,我刚刚创建了一个堆栈溢出问题“ 何时不使用正则表达式 ”

用于查找C样式字符串的正则表达式是:

 "(?:[^"\\]+|\\.)*" 

这不会考虑注释,因此最好的方法是首先删除所有注释,使用以下正则表达式:

 /\*(?s:(?!\*/).)*\*/|//.* 

请注意,如果将上述正则表达式放在一个字符串中,则需要将所有反斜杠加倍并转义任何引号。

更新:更改了注释的正则表达式,以便对多行注释使用DOTALL标志。

此外,您可能希望支持文字字符串,因此请使用此字符串而不是其他字符串正则表达式:

 @"(?:[^"]+|"")*"|"(?:[^"\\]+|\\.)*" 

并提醒一下:不要将DOTALL用作任何这些正则表达式的全局标志,因为它会破坏单行注释和单行字符串(正常字符串是单行,而文字字符串可以跨越多行。 )

通过www.regular-expressions.info :

"[^"\\\r\n]*(?:\\.[^"\\\r\n]*)*"匹配一个单行字符串,如果它被转义,则引号字符可以出现在该字符串中反斜杠。 虽然这个正则表达式可能看起来比它需要的更复杂,但它比简单的解决方案快得多,如果双引号出现在某个地方而不是字符串的一部分,它会导致大量的回溯。 "[^"\\]*(?:\\.[^"\\]*)*"允许字符串跨越多行。

我在我自己的C#解析器中使用的5美分表达式:

普通字符串:

“((\”)| [^“\] | \)

逐字字符串:

@( “[^”] *“)+