Regex.split, как читать слева от сопоставленного шаблона - PullRequest
0 голосов
/ 16 августа 2010

Я пытаюсь преобразовать скрипт Perl в подпрограмму C # 3.5.

Код Perl, который у меня есть:

if($work =~ /\<[0-9][0-9][0-9]\>/){
    $left       = $`;
    $match      = $&;
    $work       = $';
}

В C # я написал следующий код:

string[] sSplit = Regex.Split(work, @"\<[0-9][0-9][0-9]\>");
if sSplit.length is > 2
{
    left = sSplit[0];
    match = sSplit[1];
    work = sSPlit[2];
}

Однако вышеприведенное не дает мне сопоставленный шаблон в sSplit[1], а содержит содержимое справа от сопоставленной строки.

Ответы [ 3 ]

4 голосов
/ 16 августа 2010

Regex.Split не то, что вам нужно. Эквивалент =~ /.../ равен Regex.Match.

Однако, Regex.Match не имеет эквивалента $&#96; или $' в Perl, поэтому вам нужно использовать обходной путь, но я думаю, что это справедливо:

var m = Regex.Match(work, @"^(.*?)(\<[0-9][0-9][0-9]\>)(.*)$", RegexOptions.Singleline);
if (m.Success)
{
    left = m.Groups[0].Value;
    match = m.Groups[1].Value;  // perhaps with Convert.ToInt32()?
    work = m.Groups[2].Value;
}

Кроме того, вы можете использовать индекс совпадения и длину, чтобы получить материал:

var m = Regex.Match(work, @"^\<[0-9][0-9][0-9]\>");
if (m.Success)
{
    left = work.Substring(0, m.Index);
    match = m.Value;  // perhaps with Convert.ToInt32()?
    work = work.Substring(m.Index + m.Length);
}
2 голосов
/ 16 августа 2010

При попытке использования регулярных выражений я всегда рекомендую RegexHero , который представляет собой онлайн-инструмент для визуализации ваших регулярных выражений .NET. В этом случае используйте Regex.Match и используйте Группы. Это даст то, что вы хотите.

Обратите внимание, что обратная косая черта в \< и \> не требуется в C # (как и в Perl, кстати).

Также обратите внимание, что $&#x60;, $& и $' имеют эквиваленты в C # при использовании в выражении замены. Если в конце концов это то, что вам нужно, вы можете использовать эти «магические переменные», но только в Regex.Replace.

1 голос
/ 16 августа 2010

A split обычно просит выбросить разделителей.Perl действует точно так же (без переменных типа verboten $&.)

Вы захватываете разделители в Perl, помещая их в скобки:

my @parts = split /(<[0-9][0-9][0-9]>)/; # includes the delimiter
my @parts = split /<[0-9][0-9][0-9]>/;   # doesn't include the delimiter
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...