2

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

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”,包括“。我尝试了以下内容,它正确地给了我:

"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.除了匹配 test“abc”和 test“rst”之外的任何字符。所以,我尝试了以下但如下所示匹配“rst”“uvw”的第 1 组和第 2 组是错误的。我需要“rst”“uvw”的第 1 组为“rst”,第 2 组为空,因为“rst”后面的字符是“:

第 1 组:“abc”

第 2 组:=

第一组:“第一”

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

2 回答 2

1

你一定在寻找

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

演示

我做了2个改变:

  • 使用否定字符类[^"]*(匹配除双引号之外的 0 个或多个字符)而不是惰性匹配任何字符.*?
  • 使用量词制作[^"]可选。?

在此处输入图像描述

于 2015-07-26T20:24:04.790 回答
0

两个替代版本:

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

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

(?<=test)("[^"]+"[^"]?)
于 2015-07-26T22:26:55.240 回答