Regex.split,如何读取匹配模式的左侧

时间:2010-08-16 15:12:00

标签: c# regex perl

我正在尝试将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 个答案:

答案 0 :(得分:4)

Regex.Split不是您所需要的。等同于=~ /.../的是Regex.Match

但是,Regex.Match与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);
}

答案 1 :(得分:2)

在尝试正则表达式时,我总是推荐RegexHero,这是一个可视化.NET正则表达式的在线工具。在这种情况下,请使用Regex.Match并使用Groups。这会给你想要的东西。

请注意,C#中不需要\<\>中的反斜杠(也不是Perl,btw)。

另请注意,$`$&$'在替换表达式中使用时具有C#中的等效项。如果这是你最终需要的,你可以使用这些“魔术变量”,但只能在Regex.Replace中使用。

答案 2 :(得分:1)

split通常要求抛出远离分隔符。 Perl的行为方式相同(没有verboten $&类型变量。)

通过在它们周围放置pare来捕获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