C# 查找包含重复引号的引号内的内容

C# 查找包含重复引号的引号内的内容,c#,.net,regex,C#,.net,Regex,各位 给定要分析的字符串:“Hello”和“world!” 是否可能以两个匹配项结尾:“Hello”和“world!” 顺便说一下,我正在解析VB代码,我正在尝试查找字符串。它们总是用双引号括起来,但里面的双引号可能太类似于C#中的@“Hello”“world!” 我愿意接受任何建议!我的代码解析器将用C#btw编写 我正在使用“[^”]+”或“+?”作为我的试验的基础,但无法确定如何获得所需的结果。您的“[^”+”将在“之后的第一个”停止,因此,您将不会得到“xx”“z”“子字符串作为输出,您

各位

给定要分析的字符串:
“Hello”和“world!”

是否可能以两个匹配项结尾:
“Hello”
“world!”

顺便说一下,我正在解析VB代码,我正在尝试查找字符串。它们总是用双引号括起来,但里面的双引号可能太类似于C#中的
@“Hello”“world!”

我愿意接受任何建议!我的代码解析器将用C#btw编写

我正在使用
“[^”]+”
“+?”
作为我的试验的基础,但无法确定如何获得所需的结果。

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

您可以使用也将在引号内匹配转义序列的:

"[^"\\]*(?:(?:\\.|"")[^"\\]*)*"
或者为您的案例提供一个简化的解决方案:

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

后一种正则表达式解释:

  • -匹配一个
  • [^”]*
    -匹配0个或更多字符,而不是
  • (?:“”[^”]*)*
    -匹配0个或多个。。。
    • -两个连续的引号
    • [^”]*
      -0个或更多字符,而不是
  • -匹配一个
在C#中,您可以使用逐字字符串文字(需要使用
表示一个文字
)或常规字符串文字(需要使用
表示
,并对特殊正则表达式元字符使用双转义符)来声明这些正则表达式

逐字记录:

var rx = new Regex(@"""[^""]*(?:""""[^""]*)*""");
常规字符串文字:

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

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

你确定要从头开始编写VB解析器吗?@CodeCaster它的目的是在13年历史的遗留VB6代码中查找字符串,不幸的是,这些代码必须国际化。我甚至不查找所有字符串,只查找在
.Captio等属性上设置的字符串n
。我的问题是你是否确定要重新发明轮子。各种语言的解析器都是免费提供的。答案很好。
(?:“”[^]*)*
组是我想不出来的聪明部分:)。
(?:“”[^]*)*
组是
(?:“”[^]*)的“未包装”版本,只是效率更高,因为它涉及更少的回溯(尽管可读性较差:())。