вторник, 21 июля 2009 г.

Perl, C# и регулярные выражения

Казалось бы, Perl и C# -- языки очень разные, но как оказывается, C# поддерживает стандарт де-факто регулярных выражений – Перл совместимые регулярные выражения.

Конечно же, для Perl регулярные выражения родные, и сними намного удобней работать именно в Перле, но, для того чтобы регулярные выражения заработали в C# -- достаточно просто взять и скопировать их из перлового скрипта.

Единственное что мне пока что не нравиться – это то, что регекспы в C# компилируется в момент выполнения. Таким образом, можно допустить ошибку где-то в тридесятом условии, в тридевятом вызове метода, и тогда вылезет исключение. В Перл регекспы проверяться в момент компиляции скрипта и банальные опечатки вылезают сразу же.

Именно поэтому, я разрабатываю и тестирую регекспы в Перл, и лишь потом переношу их в C#. Это получается быстрей удобней и стабильней.

Напоследок хочу продемонстрировать на простом примере, что уже сейчас код на C# выглядит ненамного избыточней, чем его аналог на Perl.

Следующий код выводит дату и время из строчек массива variants:

#!perl
my @variants =
(
q~^92(28/10/2002)**&[19:10:50]@Comment: Text String"~,
q~^-06/02/2002*$21:55:45~,
q~^*13/08/2002*DX145&[22:50:20]@Comment: Text String~,
);

foreach my $variant ( @variants ) {

if ( $variant =~ m!([0-3][0-9]/[0-1][0-9]/[1-2]\d\d\d).+?
                       ([0-2][0-9]:[0-5][0-9]:[0-5][0-9])!x )
{
print "Date: $1; Time: $2\n";
}
else {
print "Failed to parse string: $variant\n";
}
}


И пример на C#:

using System;
using System.Text.RegularExpressions;

namespace RegexTest
{
class Program
{
static void Main(string[] args)
{
string[] variants = {
@"^92(28/10/2002)**&[19:10:50]@Comment: Text String""",
@"^-06/02/2002*$21:55:45",
@"^*13/08/2002*DX145&[22:50:20]@Comment: Text String",
};
Regex veriantRegex = new Regex(@"(?<date>[0-3][0-9]/[0-1][0-9]/[1-2]\d\d\d).+?" +
@"(?<time>[0-2][0-9]:[0-5][0-9]:[0-5][0-9])" );
foreach (var variant in variants)
{
Match match = Match.Empty;
if ((match = veriantRegex.Match(variant)) != Match.Empty)
{
Console.WriteLine("Date: {0}; Time: {1}", match.Groups["date"].Value,
match.Groups["time"].Value);
}
else
{
Console.WriteLine("Failed to parse string: {0}", variant);
}
}
}
}
}


Output:

Date: 28/10/2002; Time: 19:10:50
Date: 06/02/2002; Time: 21:55:45
Date: 13/08/2002; Time: 22:50:20
 

.NET ate my MOSK;. Powered By Blogger © 2009 Bombeli | Theme Design: ooruc