C# 奇数regexp行为-仅匹配第一个和最后一个捕获组

C# 奇数regexp行为-仅匹配第一个和最后一个捕获组,c#,regex,perl,capture,C#,Regex,Perl,Capture,我正在尝试编写一个regexp,它将匹配逗号分隔的单词列表并捕获所有单词。这条线应该是苹果、香蕉、橘子、花生,捕获的应该是苹果、香蕉、橘子、花生。为此,我使用以下regexp: ^\s*([a-z_]\w*)(?:\s*,\s*([a-z_]\w*))*\s*$ 它成功地匹配了字符串,但突然只捕获了apple和peant。这种行为在C#和Perl中都可以看到。因此,我假设我遗漏了一些关于regexp匹配如何工作的信息。有什么想法吗?:) 是的,在每次重复匹配时,上一个内容都会被覆盖。因此,最后

我正在尝试编写一个regexp,它将匹配逗号分隔的单词列表并捕获所有单词。这条线应该是苹果、香蕉、橘子、花生,捕获的应该是苹果、香蕉、橘子、花生。为此,我使用以下regexp:

^\s*([a-z_]\w*)(?:\s*,\s*([a-z_]\w*))*\s*$
它成功地匹配了字符串,但突然只捕获了
apple
peant
。这种行为在C#和Perl中都可以看到。因此,我假设我遗漏了一些关于regexp匹配如何工作的信息。有什么想法吗?:)

是的,在每次重复匹配时,上一个内容都会被覆盖。因此,最后只有第二个捕获组的最后一个匹配项可用

您可以将第二个捕获组更改为

^\s*([a-z_]\w*)((?:\s*,\s*(?:[a-z_]\w*))*)\s*$
第二组的结果是“香蕉、橘子、花生”。我不确定,如果你想要这个

如果要检查字符串是否具有该模式并提取每个单词。我会分两步来做

  • 用正则表达式检查模式

  • 如果模式正确,请在
    \s*,\s*
    上删除前导和尾随空格并拆分


  • match.Groups[2]给出的值就是第二个组捕获的最后一个值

    要查找所有值,请查看
    match.Groups[2]。捕获[i]。值
    ,在本例中,
    i
    的范围为
    0
    2
    。(以及第一组的
    match.Groups[1]。值

    (+1作为问题,我今天学到了一些东西!)

    试试这个:

    string text = "   apple , banana ,orange,peanut";
    
    var matches = Regex.Matches(text, @"\s*(?<word>\w+)\s*,?")
            .Cast<Match>()
            .Select(x => x.Groups["word"].Value)
            .ToList();
    
    string text=“苹果、香蕉、橘子、花生”;
    var matches=Regex.matches(文本,@“\s*(?\w+)\s*,?”)
    .Cast()
    .选择(x=>x.Groups[“word”].值)
    .ToList();
    
    简单正则表达式:

    (?:^ |*)(.+?)(?:,|$)

    说明:

    ?:    # Non capturing group
    ^| *  # Match start of line or multiple spaces
    .+    # Capture the word in the list, lazy
    ?:    # Non capture group
    ,|$   # Match comma or end of line 
    

    注:这是一个很好的网站,用于测试这类东西

    +1我不确定.net是否有此功能,并且懒得检查。@stema我甚至没有意识到这是一个问题,我以为所有的值都会出现在
    组中
    !感谢您给我指出
    。捕获
    收藏!最终,我想到了使用与我在问题中提出的相同的regexp,然后我为(int I=1;I
    PS:这是一个在.NET中测试正则表达式的好网站:我喜欢。谢谢@bazzilic和ChankeyPathak,我不知道那些网站。