Regex.Split在与群组合作时如何运作?

时间:2011-02-04 10:29:21

标签: c# regex

我正在尝试根据正则表达式中的组拆分以下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

2 个答案:

答案 0 :(得分:3)

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

// 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
        }
    }
}

答案 1 :(得分:1)

我认为你在混合......

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