1

I am trying to replace a pattern in my string with a captured group, but not directly. The value for the captured group resides in a dictionary, keyed by the captured group itself. How can I achieve this?

This is what I'm trying:

string body = "hello [context.world]!! hello [context.anotherworld]";
Dictionary<string, string> dyn = new Dictionary<string, string>(){ {"world", "earth"}, {"anotherworld", "mars"}};
Console.WriteLine(Regex.Replace(body, @"\[context\.(\w+)\]", dyn["$1"]));

I keep getting KeyNotFoundException which indicates to me that the $1 is getting interpreted literally during dictionary lookup.

1 Answer 1

3

You need to pass the match to a match evaluator like this:

string body = "hello [context.world]!! hello [context.anotherworld] and [context.text]";
Dictionary<string, string> dyn = new Dictionary<string, string>(){ 
            {"world", "earth"}, {"anotherworld", "mars"}
};
Console.WriteLine(Regex.Replace(body, @"\[context\.(\w+)]", 
        m => dyn.ContainsKey(m.Groups[1].Value) ? dyn[m.Groups[1].Value] : m.Value));

See the online C# demo.

Check if the dictionary contains the key first. If it doesn't, just re-insert the match, else, return the corresponding value.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.