We all know regular expressions are great for matching patterns and parsing strings, but if you really want to take your Regex game to the next level, spend some time looking at capture groups. Using capture groups–more specifically, named capture groups–makes it easier to manipulate results and replacements, and it also has a fortunate side-effect of improving readability.
To create a named capture group in a .net regular expression, use the syntax “(?<Name>pattern).” The name acts like an inline comment and allows you to reference the group using that name by using “${Name}” in Result and Replace statements.
Let’s look at an example that uses Replace. Social Security numbers are a sensitive piece of information that is often masked when displaying details. Let’s use a regular expression to hide part of the number.
var ssn = "123-45-6789"; var re = new Regex(@"\d{3}-\d{2}-(?<lastFour>\d{4})"); var masked = re.Replace(ssn, "xxx-xx-${lastFour}"); Console.WriteLine("{0} -> {1}", ssn, masked);
123-45-6789 -> xxx-xx-6789
Another common scenario is to extract a piece of data from a string. Here’s another quick example that extracts the month and year from a date string (great for grouping items in a reporting scenario!).
var date = "01/15/2012"; var re = new Regex(@"(?<month>\d{1,2})/(?<day>\d{1,2})/(?<year>\d{4})"); var monthYear = re.Match(date).Result("${year}-${month}"); Console.WriteLine("{0} -> {1}", date, monthYear);
01/15/2012 -> 2012-01