查找带有重复引号的引号内的内容

时间:2015-10-29 11:46:20

标签: c# .net regex

民间,

给定要解析的字符串:"Hello " & """world!"""

是否有可能最终得到两个匹配:"Hello""""world!"""

我顺便解析VB代码,我试图找到字符串。它们总是双引号,但内部重复的双引号可能与C#中的@"Hello ""world!"""太相似。

我对任何建议持开放态度!我的代码解析器将用C#btw。

编写

我使用"[^"]+"".+?"作为我的试验的基础,但无法弄清楚如何获得所需的结果。

1 个答案:

答案 0 :(得分:3)

您的"[^"]+"将在"后的第一个"停止,因此,您不会将"xx""z"""子字符串作为输出,您将只获得"xx" }。与".*?"相同,因为您没有限制第二个"的直接上下文(并且除非您指定RegexOptions.Singleline标志,否则第二个正则表达式也会遇到换行符号。)

您可以使用following regex,它也会匹配引号内的转义序列:

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

或针对您的案例进行简化:

"[^"]*(?:""[^"]*)*"

请参阅another demo

后者的正则表达式解释:

  • " - 匹配"
  • [^"]* - 匹配"
  • 以外的0个或多个字符
  • (?:""[^"]*)* - 匹配0个或更多个序列...
    • "" - 连续2次引用
    • [^"]* - 除"
    • 以外的0个或多个字符
  • " - 匹配"

在C#中,您可以使用逐字字符串文字(您需要使用""表示一个文字")或常规字符串文字(您需要使用\"的地方)表示"并使用特殊正则表达式元字符的双转义来声明这些正则表达式。

逐字:

var rx = new Regex(@"""[^""]*(?:""""[^""]*)*""");

常规字符串文字:

var rx = new Regex("\"[^\"]*(?:\"\"[^\"]*)*\"");

我认为在这种情况下,常规字符串文字声明更清晰。