Reputation: 843
This is the input string 23x * y34x2
. I want to insert " * "
(star surrounded by whitespaces) after every number followed by letter, and after every letter followed by number. So my output string would look like this: 23 * x * y * 34 * x * 2
.
This is the regex that does the job: @"\d(?=[a-z])|[a-z](?=\d)"
. This is the function that I wrote that inserts the " * "
.
Regex reg = new Regex(@"\d(?=[a-z])|[a-z](?=\d)");
MatchCollection matchC;
matchC = reg.Matches(input);
int ii = 1;
foreach (Match element in matchC)//foreach match I will find the index of that match
{
input = input.Insert(element.Index + ii, " * ");//since I' am inserting " * " ( 3 characters )
ii += 3; //I must increment index by 3
}
return input; //return modified input
My question how to do same job using .net MatchEvaluator
? I am new to regex and don't understand good replacing with MatchEvaluator
. This is the code that I tried to wrote:
{
Regex reg = new Regex(@"\d(?=[a-z])|[a-z](?=\d)");
MatchEvaluator matchEval = new MatchEvaluator(ReplaceStar);
input = reg.Replace(input, matchEval);
return input;
}
public string ReplaceStar( Match match )
{
//return What??
}
Upvotes: 62
Views: 39812
Reputation: 1612
In Delphi or maXbox you have the same possibility:
writeln('match eval3');
with TregEx.create1('\d(?=[a-z])|[a-z](?=\d)') do begin
writeln(Replace1('23x * y34x2', @matcheval));
free; end;
and matcheval is a callback or anonymous as
function matcheval(const Match: TMatch): string;
begin
result:= match.Value + ' * ';
end;
Behind the scene works also a core regex as $ function or called backreference (is called 4 times) that does the same!:
writeln(regexReplaceall('23x * y34x2','\d(?=[a-z])|[a-z](?=\d)', '$+ * ', []));
23 * x * y * 34 * x * 2
Upvotes: 1
Reputation: 838116
A MatchEvaluator is a delegate that takes a Match object and returns a string that should be replaced instead of the match. You can also refer to groups from the match. You can rewrite your code as follows:
string input = "23x * y34x2";
Regex reg = new Regex(@"\d(?=[a-z])|[a-z](?=\d)");
string result = reg.Replace(input, delegate(Match m) {
return m.Value + " * ";
});
To give an example of how this works, the first time the delegate is called, Match parameter will be a match on the string "3"
. The delegate in this case is defined to return the match itself as a string concatenated with " * "
. So the first "3"
is replaced with "3 * "
.
The process continues in this way, with delegate being called once for each match in the original string.
Upvotes: 89