【问题标题】:How does Regex.Split work when working with groups?Regex.Split 在与组一起工作时如何工作?
【发布时间】:2011-02-04 18:58:02
【问题描述】:

我正在尝试根据正则表达式中的组拆分以下 ID 字符串:

string id = "aBcDe-fghIj-KLmno-pQRsT-uVWxy";
string regex = "^([a-z]{5}-){4}([a-z]{5})$";

Regex idRegex = new Regex(regex, RegexOptions.IgnoreCase);
var match = idRegex.Match(id);
var split = idRegex.Split(id);

split 字符串数组中的结果组是:

pQRsT-
uVWxy

似乎只有与正则表达式中的第一个组匹配的最后一个实例才会保留在字符串数组中。

是否可以使用 Regex.Split 返回该组的所有实例?

这样字符串数组包含:

aBcDe-
fghIj- 
KLmno- 
pQRsT- 
uVWxy

【问题讨论】:

    标签: c# regex


    【解决方案1】:

    如果您使用 Regex.Match,则返回的匹配对象包含一个组列表,每个组都有一个捕获列表。我相信组集合中的组是按其右括号的位置排序的,组的捕获是按它们在输入字符串中的位置排序的。

    // untested code
    Match match = idRegex.Match(id);
    
    if(match.Success)
    {
        foreach (Group group in match.Groups)
        {
            foreach(Capture capture in group.Captures)
            {
                // do something with capture.Value
            }
        }
    }
    

    【讨论】:

    • 完美,我不知道每个组的捕获列表都存在!感谢您的帮助。
    • 谢谢@fletcher,虽然我认为Paolo Tedesco的回答可能更正确,因为你的问题的措辞:)
    【解决方案2】:

    我觉得你是在混...

    Split 将拆分一个字符串,即将它分成子字符串删除您提供的模式,例如,如果您在“-”上拆分:

    foreach (string s in Regex.Split("aBcDe-fghIj-KLmno-pQRsT-uVWxy", "-")) {
        Console.WriteLine(s);
    }
    

    你会得到字母组,没有你用作分割参数的字符串:

    aBcDe
    fghIj 
    KLmno 
    pQRsT 
    uVWxy
    

    再举个例子,如果你用空格作为分隔符来分割一个句子,你会得到句子中的单词。

    否则,要获得末尾带有“-”的字母组,您需要搜索匹配项:

    foreach (Match m in Regex.Matches("aBcDe-fghIj-KLmno-pQRsT-uVWxy", @"\w{5}-?")) {
        Console.WriteLine(m.Value);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-03
      • 2011-08-17
      • 2019-02-24
      • 2013-11-20
      相关资源
      最近更新 更多