Let's say I have some text such as this:
[MyAppTerms.TermName1]. [MyAppTerms.TermName2]. 1- [MyAppTerms.TermNameX] 2- ...
I want to replace every occurrence of [MyAppTerms.Whatever] with the result of ReadTerm( "MyAppTerms.Whatever" ), where ReadTerm is a static function which receives a term name and returns the term text for the current language.
Is this feasible using Regex.Replace? (alternatives are welcome). I'm looking into substitution groups but I'm not sure if I can use functions with them.
Use the Regex.Replace(String, MatchEvaluator) overload.
static void Main()
{
    string input = "[MyAppTerms.TermName1]. [MyAppTerms.TermName2]. 1- [MyAppTerms.TermNameX] 2";
    Regex regex = new Regex(@"\[MyAppTerms\.([^\]]+)\]");
    string output = regex.Replace(input, new MatchEvaluator(RegexReadTerm));
    Console.WriteLine(output);
}
static string RegexReadTerm(Match m)
{
    // The term name is captured in the first group
    return ReadTerm(m.Groups[1].Value);
}
The pattern \[MyAppTerms\.([^\]]+)\] matches your [MyAppTerms.XXX] tags and captures the XXX in a capture group. This group is then retrieved in your MatchEvaluator delegate and passed to your actual ReadTerm method.
It's even better with lambda expressions (since C# 3.0):
static void Main()
{
    string input = "[MyAppTerms.TermName1]. [MyAppTerms.TermName2]. 1- [MyAppTerms.TermNameX] 2";
    Regex regex = new Regex(@"\[MyAppTerms\.([^\]]+)\]");
    string output = regex.Replace(input, m => ReadTerm(m.Groups[1].Value));
    Console.WriteLine(output);
}
Here, you define the evaluator straight inside the code which uses it (keeping logically connected pieces of code together) while the compiler takes care of constructing that MatchEvaluator delegate.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With