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

Posted

技术标签:

【中文标题】C# 正则表达式捕获组不起作用【英文标题】:C# Regex capturing group not working 【发布时间】:2015-10-16 22:53:12 【问题描述】:

在下面的代码中,我想捕获以 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 组:=

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

【问题讨论】:

【参考方案1】:

你一定在寻找

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

见demo

我做了 2 处更改:

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

【讨论】:

会做完全一样的,除了最后一个?如果你把它放在组里似乎更直观。 把 ?组内将更改下一组的组号(如果存在)。我喜欢 ?组外 @stribizhev,谢谢。有效。在我的 C# 代码中,我必须转义 " 才能做到:test(\"[^\"]*\")([^\"])? @nam:您不妨使用逐字字符串文字var rx = new Regex(@"test(""[^""]*"")([^""])?");【参考方案2】:

两个替代版本:

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

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

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

【讨论】:

以上是关于C# 正则表达式捕获组不起作用的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个 C# 正则表达式不起作用?

我的正则表达式在 C# 中不起作用

包含正则表达式分隔符的简单且经过测试的在线正则表达式在 C# 代码中不起作用

包含正则表达式分隔符的简单且经过测试的在线正则表达式在 C# 代码中不起作用

与正则表达式捕获字符串一起使用时,SQLite SELECT 在 Ruby 中不起作用,但与字符串文字一起使用

如何将正则表达式捕获存储在 Perl 的数组中?