【问题标题】:Odd regexp behaviour - matches only first and last capture group奇怪的正则表达式行为 - 仅匹配第一个和最后一个捕获组
【发布时间】:2012-11-19 08:32:27
【问题描述】:

我正在尝试编写一个匹配逗号分隔的单词列表并捕获所有单词的正则表达式。此行应匹配   apple , banana ,orange,peanut ,捕获应为applebananaorangepeanut。为此,我使用以下正则表达式:

^\s*([a-z_]\w*)(?:\s*,\s*([a-z_]\w*))*\s*$

它成功匹配了字符串,但突然之间只捕获了applepeanut。在 C# 和 Perl 中都可以看到这种行为。因此,我假设我错过了一些关于正则表达式匹配如何工作的东西。有任何想法吗? :)

【问题讨论】:

    标签: c# regex perl capture


    【解决方案1】:

    match.Groups[2].Value 给出的值只是第二组捕获的 last 值。

    要查找所有值,请查看match.Groups[2].Captures[i].Value,在这种情况下,i 的范围从02。 (以及第一组的match.Groups[1].Value。)

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

    【讨论】:

    • +1 我不确定 .net 是否有此功能,懒得检查。
    • @stema 我什至没有意识到这是个问题,我以为所有的值都会出现在Groups
    • 感谢您指点我.Captures 收藏!最终我想出了使用与我提出问题相同的正则表达式,然后我使用for (int i = 1; i < match.Groups.Count; i++) foreach (var capture in match.Groups[i].Captures) { ... do smth with capture ... }
    【解决方案2】:

    试试这个:

    string text = "   apple , banana ,orange,peanut";
    
    var matches = Regex.Matches(text, @"\s*(?<word>\w+)\s*,?")
            .Cast<Match>()
            .Select(x => x.Groups["word"].Value)
            .ToList();
    

    【讨论】:

    • PS:这是一个在 .NET 中测试正则表达式的好网站:Regex Hero
    • 我喜欢this one
    • 感谢@bazzilic 和 ChankeyPathak,我不知道那些网站。
    【解决方案3】:

    你是repeating your capturing group,在每次重复匹配时,之前的内容都会被覆盖。所以最后只有第二个捕获组的最后一场比赛可用。

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

    ^\s*([a-z_]\w*)((?:\s*,\s*(?:[a-z_]\w*))*)\s*$
    

    那么结果将是第二组中的“,banana ,orange,peanut”。我不确定,如果你想要这个。

    如果您想检查字符串是否具有该模式并提取每个单词。我会分两步完成。

    1. 使用正则表达式检查模式。

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

    【讨论】:

      【解决方案4】:

      简单的正则表达式:

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

      解释:

      ?:    # 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 
      

      注意:Rublular 是一个测试这类东西的好网站。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-06-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-12
        • 1970-01-01
        • 2023-03-03
        • 1970-01-01
        相关资源
        最近更新 更多