Я делаю небольшое приложение с использованием типов .NET Regex. И типы «Capture, Group and Match» полностью смутили меня. Я никогда не видел такого уродливого решения. Может ли кто-нибудь объяснить их использование для меня? Большое спасибо.Различия между .NET Capture, Group, Match
ответ
Вот простой пример, чем в документе @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 практически с нуля и отбрасывая обратно совместимость с окном.
Привет, спасибо Алан. Еще 2 вопроса: есть свойство «Captures» для Match и Group, какая разница между Match.Captures и Group.Captures? И почему Match.Groups [0] всегда совпадает с Match.Value? Еще раз спасибо. – smwikipedia
Соответствие ISA Group ISA Capture, поэтому Match наследует 'Captures' от Group и' Value' от Capture. Матч - это нулевая группа, поэтому «Match.Captures» - это просто один элементный список, содержащий весь матч - как будто нам нужен еще один способ ссылки на него! «Значение», очевидно, является предпочтительным способом, настолько короче и интуитивно понятным. Но даже это необязательно, если вы используете ссылку Match/Group/Capture, которая ожидает строку, потому что 'ToString()' просто делегирует значение 'Value'. –
Что касается * почему * Матч - это нулевая группа, см. Этот ответ: http://stackoverflow.com/questions/2248213/in-c-regular-expression-why-does-the-initial-match-show -up-in-the-groups/2248767 # 2248767 –
Соответствие является результатом любого индивидуального совпадения всего регулярного выражения. Группы и захваты имеют как-то отношение к группам захвата (каждый из (expression)
из регулярного выражения), но различаются в том, как они себя ведут. Вот цитата из статьи MSDN по классу Capture, который объясняет разницу:
Если вы не применять квантор к захвата группы, то Group.Captures свойство возвращает CaptureCollection с одного объекта съемки что содержит информацию о том же захвате как объект группы. Если вы применить квантор к захватывая группы, то Group.Index, Group.Length, и Group.Value свойства обеспечивают информацию только о последней захваченной группы, в то время как взятие объектов в CaptureCollection предоставить информацию о всех подвыражения. Пример обеспечивает иллюстрацию.
(Source)
- 1. Capture Text Surrounding Regex Match .NET
- 2. Neo4j MATCH запросы - различия между несколькими подходами
- 3. Подгруппа Regex Capture Group
- 4. Regex Capture Second Word Within Capture Group
- 5. Haskell Regex non capture group
- 6. Nginx location group capture + rewrite
- 7. scala split on capture group
- 8. Group по найти различия
- 9. Различия в развитии между .NET и Mono
- 10. Различия между Java и Delphi .NET
- 11. Различия между поставщиками TdOleDb и Teradata .NET
- 12. Различия между Java и C# и .NET
- 13. Различия между .Net Hashtable, Java Hashtable & HashMap
- 14. Различия между .NET сети прослеживания уровней
- 15. Каковы различия и сходства между языками .NET?
- 16. Различия между .NET 3.0 и 3.5?
- 17. Различия между версиями .NET (преимущественно C#)
- 18. RegEx - Должен ли я использовать Capture или Group?
- 19. .NET Capture Window
- 20. Regex Match текст в Capture Группа
- 21. SQL GROUP BY (EXACT MATCH)
- 22. Различия WCF между .NET 3.0 и .NET 3.5
- 23. Различия между CLR между Silverlight и обычной .NET Framework?
- 24. Capture multiline, multi-group to Powershell variables
- 25. Capture, если между подстроки «»
- 26. значительные различия между средствами
- 27. Capture. Net Thread End Event
- 28. VB Net RegEx Match Multiple
- 29. . NET-эквивалент "net group/domain"?
- 30. C# Различия между двумя списками
У вас есть пример регулярного выражения, которое вы хотите, чтобы мы его объяснили? – Gumbo