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

Ian*_*ose 2 .net c# regex

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

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

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

这并不像第一次那样容易

  • "AV \" d"
  • @"A B C D"
  • @" AB"""
  • @""" AB"
  • 等等

Ian*_*ose 8

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

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

这似乎总结得很好:

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

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

@"@Q(?:[^Q]+|QQ)*Q|Q(?:[^Q\\]+|\\.)*Q".Replace('Q', '\"')
Run Code Online (Sandbox Code Playgroud)

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

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

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


Bli*_*ixt 6

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

"(?:[^"\\]+|\\.)*"
Run Code Online (Sandbox Code Playgroud)

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

/\*(?s:(?!\*/).)*\*/|//.*
Run Code Online (Sandbox Code Playgroud)

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

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

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

@"(?:[^"]+|"")*"|"(?:[^"\\]+|\\.)*"
Run Code Online (Sandbox Code Playgroud)

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

  • 但是,这种常规表达并没有考虑@""类型的字符串文字. (2认同)