Created
July 24, 2009 07:18
-
-
Save bcr/153896 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// mcs -reference:nunit.framework ReadableRegex.cs && nunit-console ReadableRegex.exe | |
using NUnit.Framework; | |
using System.Collections.Specialized; | |
using System.Text.RegularExpressions; | |
[TestFixture] | |
public class ReadableRegex | |
{ | |
[Test] | |
public void NamedParameters() | |
{ | |
const string testString = @"score 400 for 2 nights at Minas Tirith Airport"; | |
const string pattern = @"^score\s+(?<points>\d+)\s+for\s+(?<nights>\d+)\s+nights?\s+at\s+(?<property>.*)"; | |
Regex regex = new Regex(pattern); | |
Match match = regex.Match(testString); | |
Assert.AreEqual("400", match.Groups["points"].ToString()); | |
Assert.AreEqual("2", match.Groups["nights"].ToString()); | |
Assert.AreEqual("Minas Tirith Airport", match.Groups["property"].ToString()); | |
} | |
} | |
[TestFixture] | |
public class MoreReadableRegex | |
{ | |
private static StringDictionary GetTypeDictionary() | |
{ | |
StringDictionary typeMap = new StringDictionary(); | |
typeMap.Add("number", @"\d+"); | |
typeMap.Add("everything", @".*"); | |
return typeMap; | |
} | |
private static string FixSimpleTypes(Match match) | |
{ | |
return "(?<" + match.Groups["name"].ToString() + ">" + GetTypeDictionary()[match.Groups["type"].ToString()] + ")"; | |
} | |
public static string SimplePatternToFullRegex(string readableString) | |
{ | |
// Runs of spaces are \s+ | |
readableString = Regex.Replace(readableString, @"\s+", @"\s+"); | |
// Fix the patterns in the string | |
readableString = Regex.Replace(readableString, @"{\s*(?<name>\D[^,]*)\s*,(?<type>[^}]+)\s*}", FixSimpleTypes); | |
// Leading "^" matches beginning of line | |
return "^" + readableString; | |
} | |
[Test] | |
public void PassThroughCounts() | |
{ | |
Assert.AreEqual(@"^.{10,15}", SimplePatternToFullRegex(".{10,15}")); | |
} | |
[Test] | |
public void EverythingExpansion() | |
{ | |
Assert.AreEqual(@"^(?<a>.*)", SimplePatternToFullRegex("{a,everything}")); | |
Assert.AreEqual(@"^b\s+(?<a>.*)", SimplePatternToFullRegex("b {a,everything}")); | |
} | |
[Test] | |
public void NumberExpansion() | |
{ | |
Assert.AreEqual(@"^(?<a>\d+)", SimplePatternToFullRegex("{a,number}")); | |
Assert.AreEqual(@"^(?<a>\d+)\s+b\s+(?<c>\d+)", SimplePatternToFullRegex("{a,number} b {c,number}")); | |
} | |
[Test] | |
public void SpaceExpansion() | |
{ | |
Assert.AreEqual(@"^a", SimplePatternToFullRegex("a")); | |
Assert.AreEqual(@"^a\s+b", SimplePatternToFullRegex("a b")); | |
Assert.AreEqual(@"^a\s+b", SimplePatternToFullRegex("a b")); | |
Assert.AreEqual(@"^\s+a\s+", SimplePatternToFullRegex(" a ")); | |
} | |
[Test] | |
public void SimplePattern() | |
{ | |
const string testString = @"score 400 for 2 nights at Minas Tirith Airport"; | |
const string pattern = @"score {points,number} for {nights,number} nights? at {property,everything}"; | |
Regex regex = new Regex(SimplePatternToFullRegex(pattern)); | |
Match match = regex.Match(testString); | |
Assert.AreEqual("400", match.Groups["points"].ToString()); | |
Assert.AreEqual("2", match.Groups["nights"].ToString()); | |
Assert.AreEqual("Minas Tirith Airport", match.Groups["property"].ToString()); | |
} | |
} | |
public class MainClass | |
{ | |
public static void Main() | |
{ | |
return; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment