. NET Класс соответствия Regex: Как называется соответствие? - PullRequest
0 голосов
/ 23 февраля 2020

Класс Match имеет свойство name, но это всегда "0".

В частности,

Regex.Matches("abcd", "b|d")

дает два совпадения, которые я могу различить только ценность. То же самое с заменами:

Regex.Replace("abcd", "b|d", m => m.Name) // gives a0b0

Это выше дает a0b0, поэтому имя не различает их, как и ничего в классе Match.

Другие группы не Это также не поможет, поскольку

Regex.Replace("abcdef", "(b)|(d)|(f)", m => m.Groups.Count.ToString())

дает a4c4e4, поэтому при каждой оценке совпадения все группы в матче совпадают.

Это означает, что при использовании * можно использовать фактически совпадающая строка , ie. значение, невозможно узнать что-либо еще об этом, например, с каким подэлементом в регулярном выражении он был сопоставлен.

Это необходимо для выполнения нескольких различных замен с одним вызовом замены, что потенциально намного быстрее чем использовать один вызов замены для каждого шаблона, если имеется много шаблонов замены.

Правильно ли это печальное заключение или я что-то упустил?

Ответы [ 2 ]

1 голос
/ 23 февраля 2020
Regex.Replace("abcdef", "(b)|(d)|(f)", m => m.Groups.Values.Skip(1).First(g => g.Success).Name)

Это даст вам a1c2e3, что, вероятно, то, что вы хотите, если я правильно понял ваш вопрос.

Вам необходимо пропустить m.Groups[0], потому что оно одинаково для всех матчей. И m.Groups содержит все группы в вашем исходном регулярном выражении независимо от того, совпадают они или нет. Таким образом, вы можете отфильтровать группу по успеху, как в коде выше

0 голосов
/ 23 февраля 2020

Можно назвать группы захвата совпадений, используя этот шаблон

(?<YourValueHere>.+)

, а затем извлечь таким образом

myMatch.Group["YourValueHere"].Value

Это удобно, когда индексация в совпадении может быть проблематичной c такой как этот

((abc)|(def))? (GHI)

будет индекс группы совпадений захвата "GHI" 1 или 2? Чтобы избежать этого имени совпадения, такие как

((?<Name>abc)|(?<Rank>def))? (?<SerialNumber>GHI)   

Тогда вы можете проверить / извлечь как таковые

 if (myMatch.Group["Rank"].IsSuccess)
      rank = myMatch.Group["Rank"].Value

 var SerialNumber = myMatch.Group["SerialNumber"].Value;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...