C#正则表达式捕获组不工作

C#正则表达式捕获组不工作,c#,regex,capturing-group,regex-group,C#,Regex,Capturing Group,Regex Group,在下面的代码中,我想捕获任何以test开头,后面是用双引号括起来的文本的内容。例如 测试“abc” 测试“rst” 代码运行良好 private void testRegex() { string st = "this test\"abc\"= or test\"rst\"\"uvw\" or test(def)(abc) is a test."; Regex oRegex = new Regex("test\".*?\""); foreach (Match mt in

在下面的代码中,我想捕获任何以test开头,后面是用双引号括起来的文本的内容。例如

测试“abc”

测试“rst”

代码运行良好

private void testRegex()
{
    string st = "this test\"abc\"= or test\"rst\"\"uvw\" or test(def)(abc) is a test.";
    Regex oRegex = new Regex("test\".*?\"");

    foreach (Match mt in oRegex.Matches(st))
    {
        Console.WriteLine(mt.Value);
    }
}
然后,从上面的捕获中,我想捕获单词测试之后的子表达式(在上面的示例中,这些子表达式将是“abc”和“rst”,包括)。我尝试了以下方法,它正确地给出了我:

“abc”

“rst”

问题:现在我想捕捉两个子表达式1.“abc”和“rst”2.除了匹配测试“abc”和测试“rst”之后的“abc”以外的任何字符。因此,我尝试了以下操作,但如下所示,匹配“rst”“uvw”的组1和组2是错误的。我需要“rst”“uvw”的组1是“rst”第2组为空,因为“rst”后面的字符是:

第一组:“abc”

第2组:=

第1组:“rst”

第2组:美国

private void testRegex()
        {
            string st = "this test\"abc\"= or test\"rst\"\"uvw\" or test(def)(abc) is a test.";
            Regex oRegex = new Regex("test(\".*?\")([^\"])");

            foreach (Match mt in oRegex.Matches(st))
            {
                Console.WriteLine(mt.Groups[1].Value);
                Console.WriteLine(mt.Groups[2].Value);
            }
        }

你一定在找我

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

我做了两个改变:

  • 使用了否定字符类
    [^”]*
    (匹配0个或多个字符而不是双引号),而不是将任何字符与
    *?
  • 使用
    量词使
    [^”]
    可选

两种备选版本:

(?<=test)("[^"]+")([^"])?

(?会做完全相同的事情,除了最后一个
如果你把它放在组内,看起来更直观。把?放在组内会改变下一个组的组号(如果有)。我喜欢在组外的group@stribizhev,谢谢。它起作用了。在我的C代码中,我不得不逃离“要做到这一点:
test(\”[^\“]*\”([^\“])?
@nam:您最好使用逐字字符串literal
var rx=new Regex(@“test”(“[^”“]*”)([^”“])?”;
(?<=test)("[^"]+")([^"])?
(?<=test)("[^"]+"[^"]?)