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, 2nd Edition 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.