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

时间:2009-06-08 16:08:01

标签: c# .net regex

  

很久以前我问过这个问题,   我希望我已经阅读了答案   When not to use Regex in C# (or Java, C++ etc) 优先!

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

这应该不会很难,但是在我花时间尝试构建正则表达式之前,有没有人有一个“预装”的?

由于

,这并不像第一次那样容易
  • “av \”d“
  • @“ab”“cd”
  • @“ab”“”
  • @“”“ab”

4 个答案:

答案 0 :(得分:8)

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

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

这似乎总结得很好:

  

Some people, when confronted with a problem, think “I know, I'll use   regular expressions.” Now they have two problems.

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

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

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

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

让我们看看我们是否可以帮助解决这个问题,我刚刚创建了一个堆栈溢出问题“When not to use Regex

答案 1 :(得分:6)

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

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

这不会考虑评论,所以最好的办法是首先删除所有评论,使用以下正则表达式:

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

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

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

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

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

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

答案 2 :(得分:0)

通过www.regular-expressions.info

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

答案 3 :(得分:0)

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

普通字符串:

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

逐字字符串:

@( “[^”] *“)+