2010-02-12 3 views
6

Я делаю небольшое приложение с использованием типов .NET Regex. И типы «Capture, Group and Match» полностью смутили меня. Я никогда не видел такого уродливого решения. Может ли кто-нибудь объяснить их использование для меня? Большое спасибо.Различия между .NET Capture, Group, Match

+0

У вас есть пример регулярного выражения, которое вы хотите, чтобы мы его объяснили? – Gumbo

ответ

12

Вот простой пример, чем в документе @Dav цитируемой:

string s0 = @"foo%123%456%789"; 
Regex r0 = new Regex(@"^([a-z]+)(?:%([0-9]+))+$"); 
Match m0 = r0.Match(s0); 
if (m0.Success) 
{ 
    Console.WriteLine(@"full match: {0}", m0.Value); 
    Console.WriteLine(@"group #1: {0}", m0.Groups[1].Value); 
    Console.WriteLine(@"group #2: {0}", m0.Groups[2].Value); 
    Console.WriteLine(@"group #2 captures: {0}, {1}, {2}", 
        m0.Groups[2].Captures[0].Value, 
        m0.Groups[2].Captures[1].Value, 
        m0.Groups[2].Captures[2].Value); 
} 

результат:

full match: foo%123%456%789
group #1: foo
group #2: 789
group #2 captures: 123, 456, 789

Результаты full match и group #1 являются простыми, но другие требуют некоторого объяснения. Группа № 2, как вы можете видеть, находится внутри группы, не связанной с захватом, которая контролируется квантором +. Он соответствует три раза, но если вы запросите его Value, вы получите только то, что он сопоставил в третий раз - окончательный захват. Аналогично, если вы используете заполнитель $2 в заменяющей строке, окончательный захват - это то, что вставлено на его место.

В большинстве ароматов регулярных выражений это все, что вы можете получить; каждый промежуточный захват перезаписывается следующим и утерян; .NET почти уникален в сохранении всех захватов и делает их доступными после выполнения матча. Вы можете получить к ним доступ напрямую, как я здесь, или перебрать через CaptureCollection, как и вы, MatchCollection. Тем не менее, нет эквивалента для замещающих заменяющих строк $1.

Итак, причина, по которой дизайн API настолько уродлив (как вы его выразили), был двояким: сначала он был адаптирован из встроенной поддержки регулярного выражения Perl для объектно-ориентированной среды .NET; затем на него была привита структура CaptureCollection. Perl 6 предлагает гораздо более чистое решение, но авторы достигли этого, переписывая Perl практически с нуля и отбрасывая обратно совместимость с окном.

+1

Привет, спасибо Алан. Еще 2 вопроса: есть свойство «Captures» для Match и Group, какая разница между Match.Captures и Group.Captures? И почему Match.Groups [0] всегда совпадает с Match.Value? Еще раз спасибо. – smwikipedia

+0

Соответствие ISA Group ISA Capture, поэтому Match наследует 'Captures' от Group и' Value' от Capture. Матч - это нулевая группа, поэтому «Match.Captures» - это просто один элементный список, содержащий весь матч - как будто нам нужен еще один способ ссылки на него! «Значение», очевидно, является предпочтительным способом, настолько короче и интуитивно понятным. Но даже это необязательно, если вы используете ссылку Match/Group/Capture, которая ожидает строку, потому что 'ToString()' просто делегирует значение 'Value'. –

+0

Что касается * почему * Матч - это нулевая группа, см. Этот ответ: http://stackoverflow.com/questions/2248213/in-c-regular-expression-why-does-the-initial-match-show -up-in-the-groups/2248767 # 2248767 –

2

Соответствие является результатом любого индивидуального совпадения всего регулярного выражения. Группы и захваты имеют как-то отношение к группам захвата (каждый из (expression) из регулярного выражения), но различаются в том, как они себя ведут. Вот цитата из статьи MSDN по классу Capture, который объясняет разницу:

Если вы не применять квантор к захвата группы, то Group.Captures свойство возвращает CaptureCollection с одного объекта съемки что содержит информацию о том же захвате как объект группы. Если вы применить квантор к захватывая группы, то Group.Index, Group.Length, и Group.Value свойства обеспечивают информацию только о последней захваченной группы, в то время как взятие объектов в CaptureCollection предоставить информацию о всех подвыражения. Пример обеспечивает иллюстрацию.

(Source)

Смежные вопросы