C # заменить с функцией обратного вызова, как в AS3 - PullRequest
6 голосов
/ 14 января 2009

В AS3 у вас есть функция для строки с такой подписью:

function replace(pattern:*, repl:Object):String 

Repl: Object также может указывать функцию. Если вы указываете функцию, строка, возвращаемая этой функцией, вставляется вместо соответствующего содержимого.

Кроме того, возможно ли получить исходную строку, в которой я хочу заменить вещи?

(В AS3 вы можете получить исходную строку с помощью

var input:String = arguments[2]; //in the callback function

)

Я не вижу свойства в классе Match, содержащем исходную строку ...

Ответы [ 3 ]

12 голосов
/ 14 января 2009
static void Main() {

    string s1 = Regex.Replace("abcdefghik", "e",
        match => "*I'm a callback*");

    string s2 = Regex.Replace("abcdefghik", "c", Callback);
}
static string Callback(Match match) {
    return "*and so am i*";
}

Обратите внимание, что у вас есть доступ к сопоставленным данным через аргумент (и, в частности, match.Value, если только вам не нужен доступ к группам регулярных выражений (.Groups) и т. Д.).

6 голосов
/ 14 января 2009

Чтобы сделать это в C #, используйте System.Text.RegularExpressions.Regex.Replace(), который принимает обратный вызов.

5 голосов
/ 14 января 2009

Просто в качестве примера, чтобы сделать существующие ответы абсолютно конкретными и показать, как лямбда-выражения могут быть полезны:

using System;
using System.Text.RegularExpressions;

class Test
{
    static void Main()
    {
        var template = "On $today$ you need to do something.";
        var regex = new Regex(@"\$today\$");
        var text = regex.Replace(template,
            match => DateTime.Now.ToString("d"));
        Console.WriteLine(text);
    }
}

(ответ Марка появился, когда я писал это, но я оставлю его в качестве законченного примера, если кто-то не подумает, что это просто излишне.

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