Medtronic WPF Developer Ответов: 1

Лучший способ использовать регулярное выражение для сопоставления и замены


Привет

Я считаю, что есть лучший способ использовать регулярное выражение В C#, чем я сделал ниже:

public override object ProvideValue(IServiceProvider serviceProvider)
{
    Regex r = new Regex("{.+}");
    var matches = r.Matches(String);
    var replacer = new StringBuilder(String);
    foreach (var match in matches)
    {
        var newMatch = match.ToString().Substring(1, match.ToString().Length - 2);
        var value = new StaticResourceExtension(newMatch).ProvideValue(serviceProvider);
        replacer.Replace(match.ToString(), value.ToString());
    }
    return replacer.ToString();
}


Что я уже пробовал:

Приведенный выше код-это то, что я сейчас использую. Но я думаю, что есть и получше..

1 Ответов

Рейтинг:
12

Richard Deeming

Что-то вроде этого должно сработать:

private static readonly Regex Pattern = new Regex("{(.+?)}", RegexOptions.Compiled);

public override object ProvideValue(IServiceProvider serviceProvider)
{
    return Pattern.Replace(String, match =>
    {
        string newMatch = match.Groups[1].Value;
        var value = new StaticResourceExtension(newMatch).ProvideValue(serviceProvider);
        return Convert.ToString(value);
    });
}


Medtronic WPF Developer

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

Medtronic WPF Developer

Ты сделал пару ошибок, но ты привел меня в правильном направлении. Это правильный код посередине:
return Pattern.Replace(String, match =>
{
var str = совпадение.Группы[0].Значение;
var provideStr = str.Подстрока(1, стр.Длина - 2 м);
var value = new StaticResourceExtension(provideStr).Метод providevalue(поставщику услуги);
вернуть обменять.ToString(значение);
});

Richard Deeming

Нет, если вы скопируете шаблон из моего ответа, match.Groups[1].Value это даст вам то же самое, что и ваш код подстроки. :)

Конструкции Группировки - Язык Регулярных Выражений - Краткий Справочник | Microsoft Docs[^]

Richard Deeming

Единственная проблема ты вероятно нарваться на это самое "жадное" + оператор. Если у вас есть несколько совпадений для замены, он в конечном итоге обработает всю подстроку с первой { до последнего }.

Измените выражение на "{(.+?)}", и вы получите каждый матч индивидуально.

Демонстрация[^]

Maciej Los

5ed!

Medtronic WPF Developer

Спасибо, я починил его, и он отлично работает.

Clifford Nelson

Есть некоторые вещи, которые я не использовал в этом решении. Большие пальцы подняты вверх.