将正则表达式重新格式化为 C# 逐字字符串文字

Reformat a regex as a C# verbatim string literal

我有一个正则表达式模式,想在字符串前面使用 @ 符号,这样您就不需要对正则表达式转义字符进行转义。当我尝试这样做时,我不断收到编译错误 "Only assignment, call, increment, decrement and new object expressions can be used in a statement"。我确定在使用 @ 之前我需要删除字符串中的转义字符。但是我无法让它工作。有人可以帮助修改以下字符串模式以在开头使用@。

^\s*\{(\s*,?\s*\\"([^\"]*)\\"\s*:\s*\\"([^\"]*)\\")*\}\s*$

所以你有一个用像 C 或 Java 这样的语言编写的正则表达式,它没有正则表达式文字或友好的引用机制(比如 Python 的原始字符串),并且您想将它包含在 C# 程序中,使用逐字字符串文字来去除多余的反斜杠。我相信您知道 C# 仍然支持旧式引号,因此您可以按原样使用正则表达式:

"^\s*\{(\s*,?\s*\\"([^\"]*)\\"\s*:\s*\\"([^\"]*)\\")*\}\s*$"

但这里是逐字字符串:

@"^\s*\{(\s*,?\s*\""([^""]*)\""\s*:\s*\""([^""]*)\"")*\}\s*$"

顺便说一下,这是由 RegexBuddy 生成的。我粘贴了第一个字符串(带引号),告诉它它来自 Java 程序,并且去掉了引号和额外的反斜杠。然后我告诉它我正在将它复制到 C# 程序,所以它添加了新引号 (@"...") 并在正则表达式中将引号加倍。这是 RB 至少可以做的事——强烈推荐!

它没有做的是去掉内部引号前的额外反斜杠。也就是说,它忠实地将 \\" 转换为 \""。这并没有错,但是引号字符在正则表达式中没有特殊含义,因此不需要反斜杠。我会这样写:

@"^\s*\{(\s*,?\s*""([^""]*)""\s*:\s*""([^""]*)"")*\}\s*$"