Skip to content

Instantly share code, notes, and snippets.

@bcr
Created July 24, 2009 07:18
Show Gist options
  • Save bcr/153896 to your computer and use it in GitHub Desktop.
Save bcr/153896 to your computer and use it in GitHub Desktop.
// 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