.NET中与Perl正则表达式等效的内容

4
我可以帮您将一个Perl脚本转换为VB.NET。我已经完成了大部分的转换,但是一些Perl(看似简单的)正则表达式让人头痛。以下是这些Perl正则表达式在.NET中的等效形式:

1)

    $letter =~ s/Users //,;
    $letter =~ s/Mailboxes //,;
    if($letter =~ m/$first_char/i){

2)

    unless($storegroup =~ /Recovery/ || $storegroup =~ /Users U V W X Y Z/ || $storegroup =~ /Users S T/
        || $storegroup =~ /Users Q R/){

对我来说,正则表达式看起来很简单。我试图浏览 perl.org,但理解一种语言的正则表达式需要一些时间。


1
这些正则表达式是做什么的?并不是每个人都学过Perl,但他们可能知道.NET Regex。 - kennytm
那就是我正在尝试找出的。如果有一些Perl的人能用简单的英语解释这些正则表达式是做什么的,我就能够将它们转换成.NET! - r_honey
我认为这也是问题的关键 :) - pdbartlett
你的前两个表达式带有额外的逗号 - 我不是 Perl 专家,但我认为它们不应该在那里...如果它们确实存在,那么这些表达式可能会执行其他操作,而不仅仅是替换表达式中的字符串。 - Konrad Rudolph
可能是重复问题:*将Perl正则表达式翻译成.NET* - Peter Mortensen
2个回答

3
在Perl中,你可以将斜杠视为类似于双引号的东西,它们的附加含义是“在这些斜杠之间是一个正则表达式字符串”。第一个代码块是一个Perl查找/替换正则表达式:
$stringvar =~ s/findregex/replaceregex/;

这个功能需要使用findregex并将其替换为replaceregex,原地进行。给出的示例是一个非常简单的搜索,使用.NET Regex类会过于复杂。可以使用String.Replace()方法来完成任务:

letter = letter.Replace("Users ", "")
letter = letter.Replace("Mailboxes ", "")

第二部分是针对查找的Perl。如果找到了查找正则表达式字符串,它将返回true,并保留实际字符串的原样。
$stringvar =~ /findregex/;

String.Contains()可以在.NET中处理此问题:

if (!(storegroup.Contains("Recovery") _
   or storegroup.Contains("Users U V W X Y Z") _
   or storegroup.Contains("you get the idea"))) Then
    ...

嗨,丹尼尔,你的意思是第一部分是替换模式(s/text //),而第二部分是普通的正则表达式搜索吗? - r_honey
谢谢Daniel,你能否也对此进行评论: if($letter =~ m/$first_char/i) - r_honey
但是你知道吗,我认为在VB.net中正则表达式本身对于这个任务来说有些臃肿。内置的字符串操作应该可以很好地完成这些操作。 - Daniel Quinlan
1
""和string.Empty在.NET 1.0和1.1时略有不同(请参见http://blogs.msdn.com/brada/archive/2003/04/22/49997.aspx),但我不知道这是否已经改变。那时我养成了使用string.Empty的习惯,现在仍然如此! - Daniel Renshaw
1
@daniel 这里的 m 并不是指“多行匹配”。这里的 m/.../ 表示“任何被 / 包围的内容都是正则表达式模式”。而 m/$first_char/i 则是在寻找变量 $first_char 所代表的模式,而不是字符串。如果 $first_char 不包含特殊符号,则不会有区别,但是没有其他代码的话你不能确定。 - ZyX
显示剩余4条评论

0
    $letter =~ s/Users //,;
    $letter =~ s/Mailboxes //,;
    if($letter =~ m/$first_char/i){

-->

    letter = letter.Replace("Users ", "");
    letter = letter.Replace("Mailboxes ", "");
    // The next one depends on what $first_char is

并且

    unless($storegroup =~ /Recovery/ || $storegroup =~ /Users U V W X Y Z/ || $storegroup =~ /Users S T/
    || $storegroup =~ /Users Q R/){

-->

    if (!(storegroup.Contains("Recovery") || storegroup.Contains("Users U V W X Y Z") ...and so on...))

在这里使用正则表达式的唯一原因是因为Perl非常擅长处理正则表达式 :)


但那不是VB.NET代码(“to”代码)。例如,VB.NET中的注释字符是“'”。 - Peter Mortensen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接