Intro:
Some advanced techniques:
Lets try to match some arbitrary value, say the dwarf name Gloin and have it followed by any number of digits. But lets add some trickery to our debacle: not allow the phrase existing in quotes and not allowed within curly brackets like {Gimli Gloin123}.
I'll go ahead and create a regular expression like: "{[^}]+}|""Gloin\d+""|(Gloin\d+)
I'll go ahead and create a regular expression like: "{[^}]+}|""Gloin\d+""|(Gloin\d+)
The second section, "Gloin\d+", will match any content that exists within those double quotes.
The third seciton, (Gloin\d+) will match Gloin and any digits that succeed it and capture the match into group 1.
Onto some code!
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Collections.Specialized; using System.Threading.Tasks; namespace CSharpConsoleAppRegularExpression { class AdvancedTutorial { static string ConvertToYesNo(bool value) { if (value) return "Yes"; return "No"; } static void Main() { string dwarves = @"Gimli"" ""Gloin12"" Gloin11@Gloin22 {4 Gloin42}"; //string s1 = @"Jane"" ""Tarzan12"" Tarzan11@Tarzan22 {4 Tarzan34}"; //var myRegex = new Regex(@"{[^}]+}|""Tarzan\d+""|(Tarzan\d+)"); var myRegex = new Regex(@"{[^}]+}|""Gloin\d+""|(Gloin\d+)"); var group1Caps = new StringCollection(); //Match matchResult = myRegex.Match(s1); Match matchResult = myRegex.Match(dwarves); // put Group 1 captures in a list while (matchResult.Success) { if (matchResult.Groups[1].Value != "") group1Caps.Add(matchResult.Groups[1].Value); matchResult = matchResult.NextMatch(); } // Task 1: Is there a match? Console.WriteLine("*** Is there a Match? ***"); Console.WriteLine(ConvertToYesNo(group1Caps.Count > 0)); // Task 2: How many matches are there? Console.WriteLine("\n" + "*** Number of Matches ***"); Console.WriteLine(group1Caps.Count); // Task 3: What is the first match? Console.WriteLine("\n" + "*** First Match ***"); if (group1Caps.Count > 0) Console.WriteLine(group1Caps[0]); // Task 4: What are all the matches? Console.WriteLine("\n" + "*** Matches ***"); if (group1Caps.Count > 0) foreach (string match in group1Caps) Console.WriteLine(match); // Task 5: Replace the matches //string replaced = myRegex.Replace(s1, delegate(Match m) string replaced = myRegex.Replace(dwarves, delegate(Match m) { // m.Value is the same as m.Groups[0].Value if (m.Groups[1].Value == "") return m.Value; return "Thorin"; }); Console.WriteLine("\n" + "*** Replacements ***"); Console.WriteLine(replaced); // Task 6: Split // Start by replacing by something distinctive, // as in Step 5. Then split. string[] splits = Regex.Split(replaced, "Thorin"); Console.WriteLine("\n" + "*** Splits ***"); foreach (string split in splits) Console.WriteLine(split); Console.WriteLine("\nPress Any Key to Exit."); Console.ReadKey(); } } }
No comments:
Post a Comment