Может ли регулярное выражение заменить выражение для доступа к нескольким захватам в именованной группе? - PullRequest
0 голосов
/ 21 октября 2009

Я пытаюсь написать выражение для замены регулярного выражения, которое заменит полное имя универсального типа на его эквивалент C #. Например, следующий текст:

System.Collections.Generic.Dictionary`2[[System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[MyNamespace.MyClass, MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]

станет следующим именем типа C #:

System.Collections.Generic.Dictionary<System.String, MyNamespace.MyClass>

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

^(?<GenericType>.+)`\d\[(?:\[?(?<GenericTypeParam>\S*),[^\]]+\]?,?)+\]$

Теперь мне нужно написать выражение замены, которое генерирует имя типа C #. Но поскольку в группе «GenericTypeParam» может быть несколько захватов, мне нужно иметь возможность ссылаться на переменное число захватов в моем выражении замены. Вот выражение замены, которое у меня есть сейчас:

${GenericType}<${GenericTypeParam}>

Но поскольку он ссылается на группу «GenericTypeParam» по имени, он получает значение группы, которое является значением последнего захвата в группе. Итак, результат этого выражения замены:

System.Collections.Generic.Dictionary<MyNamespace.MyClass>

Таким образом, моя выходная строка содержит только последний захват в группе. Есть ли способ получить доступ к другим перехватам в выражении замены?

1 Ответ

0 голосов
/ 21 октября 2009

Я не думаю, что вы можете сделать это с помощью замены регулярных выражений. Я думаю, вам придется циклически проходить через совпадения вместо того, чтобы извлекать их с помощью выражения замены. Что-то вроде (не проверено!):

List<string> types = new List<string>();
Match m;
for (m = reg.Match(GenericTypeParam); m.Success; m = m.NextMatch()) {
    types.Add( m.Groups["GenericTypeParam"].Value ); 
}

, а затем объединить список с параметром универсального типа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...