【问题标题】:.NET equivalent to Perl regular expressions.NET 等价于 Perl 正则表达式
【发布时间】:2010-05-19 07:04:46
【问题描述】:

我需要将 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,但理解一种语言的正则表达式需要一些时间。

【问题讨论】:

  • 这些正则表达式有什么作用?不是每个人都学过 Perl,但他们可能知道 .net 正则表达式。
  • 嗯,这就是我想要找出的。如果某个 Perl 人可以用简单的英语解释这些正则表达式的作用,我将能够将它们转换为 .NET!!!
  • 我认为这也是 OP 的问题 :)
  • 你的前两个表达式带有一个额外的逗号——我不是 Perl 人,但我认为它们不属于那里……并且 if 他们这样做了,那么这些表达式可能会做一些事情除了替换表达式中的字符串。

标签: .net regex perl


【解决方案1】:

在 Perl 中,您可以将斜杠视为双引号,并附加“在这些斜杠之间是一个正则表达式字符串”的含义。第一个代码块是 Perl 查找/替换正则表达式:

$stringvar =~ s/findregex/replaceregex/;

它需要findregex 并将其替换为replaceregex,就地。给定的示例是一个非常简单的搜索,而 .NET Regex 类将是多余的。 String.Replace() 方法可以完成这项工作:

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

第二部分是仅用于查找的 Perl。如果找到了 findregex 字符串,它会返回 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 //),而第二部分是正常的正则表达式搜索??
  • 谢谢 Daniel,您能否也对此发表评论:if($letter =~ m/$first_char/i)
  • 使用臃肿的String.Empty 代替"" 有什么特别的原因吗?
  • "" 和 string.Empty 是略有不同的野兽,至少在 .NET 1.0 和 1.1 中(参见blogs.msdn.com/brada/archive/2003/04/22/49997.aspx),但我不知道这是否已经改变。那时我就​​养成了使用 string.Empty 的习惯,只是还没开始!
  • @daniel m 这里并不意味着«多行»。这里m/.../ 的意思是«/ 所包含的都是正则表达式模式»。而m/$first_char/i 搜索由变量$first_char 表示的pattern,而不是string。如果$first_char不包含特殊符号,则没有区别,但没有其他代码则无法确定。
【解决方案2】:
    $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 中的注释字符是'
猜你喜欢
  • 2012-01-07
  • 1970-01-01
  • 1970-01-01
  • 2010-10-08
  • 2011-08-24
  • 2012-06-19
  • 1970-01-01
  • 2022-01-05
相关资源
最近更新 更多