C#Regex捕获组无法正常工作

时间:2015-07-26 20:15:55

标签: c# regex capturing-group regex-group

在下面的代码中,我想捕获以test开头的所有内容,然后是双引号括起来的文本。 E.g。

test"abc"

test"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);
    }
}

然后,从上面的捕获中,我想捕获单词test之后的子表达式(在上面的例子中,那些子表达式将是" abc"和" rst"包括&# 34;我尝试了以下内容,它正确地给了我:

"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.Groups[1].Value);
        }
    }

问题:现在我要捕获两个子表达式1." abc"和" rst" 2.除了"在比赛测试之后" abc"并测试" rst"。所以,我尝试了以下内容,但如下图所示,第1组和第2组用于比赛" rst"" uvw"错了。我需要第一组"第一"" uvw"成为" rst"并且第2组为空,因为随后的字符" rst"是":

第1组:" abc"

第2组:=

第1组:"第一""

第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);
            }
        }

2 个答案:

答案 0 :(得分:1)

你一定在寻找

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

请参阅demo

我做了两处修改:

  • 使用否定字符类[^"]*(匹配双引号以外的0个或多个字符),而不是使用.*?
  • 延迟匹配任何字符
  • [^"]可选?量词。

enter image description here

答案 1 :(得分:0)

两个备用版本:

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

如果您想将结果保存在一个地方:

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