2011-02-04 4 views
1

Я пытаюсь разделить следующую строку идентификатора на основе групп в регулярных выражениях:Как работает Regex.Split при работе с группами?

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

Если вы используете 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 
     } 
    } 
} 
+0

совершенно, я не знаю, что список захватов для каждой группы существует ! Спасибо за вашу помощь. – fletcher

+0

Спасибо @fletcher, хотя я думаю, что ответ Паоло Тедеско может быть более правильным по формулировке вашего вопроса :) –

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); 
} 
Смежные вопросы