C # Regex.Replace (): получение значений - PullRequest
3 голосов
/ 14 октября 2010

Я анализирую тег изображения BB-кода:

[IMG] http://imagesource.com[/img]

Я использую следующую функцию Replace ():

Regex.Replace(msg, @"\[img\]([^\]]+)\[\/img\]", @"<img src=""$1"" border=""0"" />", RegexOptions.IgnoreCase);

И мне нужно получить URL при разборе. Мне нужно знать значение «1 доллар». Является ли это возможным? Класс Regex каким-то образом заменяет строку «$ 1» на нужное мне значение, поэтому должен быть способ его получить.

Ответы [ 3 ]

7 голосов
/ 14 октября 2010

Похоже, вы ищете метод Replace с перегрузкой, которая принимает MatchEvaluator.Страница MSDN для этого метода может быть найдена здесь .

Попробуйте вместо этого:

string input = "[img]http://imagesource.com[/img]";
string pattern = @"\[img]([^\]]+)\[\/img]";
string result = Regex.Replace(input, pattern, m =>
    {
        var url = m.Groups[1].Value;
        // do something with url here
        // return the replace value
        return @"<img src=""" + url + @""" border=""0"" />";
     },
    RegexOptions.IgnoreCase);

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

string result = Regex.Replace(input, pattern,
    m => @"<img src=""" + m.Groups[1].Value + @""" border=""0"" />",
    RegexOptions.IgnoreCase);

В вышеприведенном случае нет необходимости в return, а просто возвращает исходную строку без дополнительной оценки.Можно добавить несколько троичных операторов и добавить эту логику, но это будет выглядеть грязно.Многозначная лямбда намного чище.Вы можете рассмотреть возможность использования его собственным способом, как показано в вышеупомянутой ссылке MSDN, если он слишком велик или будет повторно использован в других Regex.Replace усилиях.

Кстати, я также немного упростил ваш шаблон,удаление побегов для ].Только отверстие [ должно быть экранировано.

0 голосов
/ 14 октября 2010

Группы захвата доступны в свойстве Captures для матча Regex. Если вы сделаете матч вместо замены, у вас будет доступ к группе.

0 голосов
/ 14 октября 2010

Чтобы сохранить захваченную строку, просто «захватите» возвращаемое значение.

 string s = Regex.Replace(msg, @"\[img\]([^\]]+)\[\/img\]", @"<img src=""$1"" border=""0"" />", RegexOptions.IgnoreCase); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...