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