3.17. Replace All Matches Within the Matches of Another Regex
Problem
You want to replace all the matches of a particular regular expression, but only within certain sections of the subject string. Another regular expression matches each of the sections in the string.
Say you have an HTML file in which various passages are marked
as bold with <b>
tags.
Between each pair of bold tags, you want to replace all matches of the
regular expression ‹before
› with the replacement text ‹after
›. For example, when
processing the string before <b>first before</b> before
<b>before before</b>
, you want to end up with:
before <b>first
after</b> before <b>after
after</b>
.
Solution
C#
Regex outerRegex = new Regex("<b>.*?</b>", RegexOptions.Singleline); Regex innerRegex = new Regex("before"); string resultString = outerRegex.Replace(subjectString, new MatchEvaluator(ComputeReplacement)); public String ComputeReplacement(Match matchResult) { // Run the inner search-and-replace on each match of the outer regex return innerRegex.Replace(matchResult.Value, "after"); }
VB.NET
Dim OuterRegex As New Regex("<b>.*?</b>", RegexOptions.Singleline) Dim InnerRegex As New Regex("before") Dim MyMatchEvaluator As New MatchEvaluator(AddressOf ComputeReplacement) Dim ResultString = OuterRegex.Replace(SubjectString, MyMatchEvaluator) Public Function ComputeReplacement(ByVal MatchResult As Match) As String 'Run the inner search-and-replace on each match of the outer regex Return InnerRegex.Replace(MatchResult.Value, "after"); ...
Get Regular Expressions Cookbook now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.