我正在尝试将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]
中的匹配模式,而是匹配字符串右边的内容。
答案 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