c# - Regex replace: Transform pattern with a custom function -


let's have text such this:

[myappterms.termname1]. [myappterms.termname2]. 1- [myappterms.termnamex] 2- ...

i want replace every occurrence of [myappterms.whatever] result of readterm( "myappterms.whatever" ), readterm static function receives term name , returns term text current language.

is feasible using regex.replace? (alternatives welcome). i'm looking substitution groups i'm not sure if can use functions them.

use 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) {     // term name captured in first group     return readterm(m.groups[1].value); } 

the pattern \[myappterms\.([^\]]+)\] matches [myappterms.xxx] tags , captures xxx in capture group. group retrieved in matchevaluator delegate , passed actual readterm method.

it's better 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, define evaluator straight inside code uses (keeping logically connected pieces of code together) while compiler takes care of constructing matchevaluator delegate.


Comments