понедельник, 25 апреля 2011 г.

Расширяем Regex

90% моей работы с регулярными выражениями происходит по следующему сценарию:
var match = Regex.Match(input, pattern);
if (!match.Success)
throw new Exception("Can't match input to pattern");
...

Написав в очередной раз эти 3 строчки, я понял, что дальше так жить нельзя - нужно реализовать метод MatchForSure (наверное, не самое удачное название - предложите свой вариант).

Печально, но C# не поддерживает extension methods, которые можно было бы вызывать как статические методы. Поэтому мы можем лишь сделать обертку или вспомогательный класс, например, вот так:
public static class RegexExtensions
{
public static Match MatchForSure(string input, string pattern)
{
var match = Regex.Match(input, pattern);
if (!match.Success)
throw new Exception(String.Format("Can't match {0} to regex pattern {1}", input, pattern));
return match;
}
}

Три строчки из начала поста сократятся до одной:

var match = RegexExtensions.MatchForSure(input, pattern);
...

Если же вы предпочитаете использовать Regex через инстанс, то можно реализовать полноценный extension method:
public static class RegexExtensions
{
public static Match MatchForSure(this Regex regex, string input)
{
var match = regex.Match(input);
if (!match.Success)
throw new Exception(String.Format("Can't match {0} to regex pattern {1}", input, pattern));
return match;
}
}

, который подразумевает следующее использование:

var match = new Regex(pattern).MatchForSure(input);
...

Мораль в стиле капитана очевидность: Любая повторяющаяся логика должна быть выявлена и выделена в отдельную сущность. Чем раньше, тем лучше.

2 комментария:

simplemath комментирует...

Имхо, логичней было бы написать свой сниппет.

http://msdn.microsoft.com/en-us/library/f7d3wz0k(v=vs.80).aspx

Idsa комментирует...

Но я все же ставил цель избавиться от дублирующейся логики, а не сэкономить время на наборе этих трех строчек...