很久以前我问过这个问题, 我希望我已经阅读了答案 When not to use Regex in C# (or Java, C++ etc) 优先!
我希望使用Regex(正则表达式)来获取C#源代码中所有字符串的列表,包括嵌入了双引号的字符串。
这应该不会很难,但是在我花时间尝试构建正则表达式之前,有没有人有一个“预装”的?
由于
,这并不像第一次那样容易答案 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美分表达式:
普通字符串:
“((\”)| [^ “\] | \)”
逐字字符串:
@( “[^”] *“)+