【问题标题】:Converting conditional Perl Regex matching to VB.NET将条件 Perl 正则表达式匹配转换为 VB.NET
【发布时间】:2021-10-26 01:49:12
【问题描述】:

在 Perl 中,您可以在条件语句中使用正则表达式匹配,例如

if ($myvar =~ /(pattern1)(pattern2)/) {
    $var1 = $1;
    $var2 = $2;
} elseif ($myvar =~ /(pattern3)(pattern4)/) {
   ...
} elseif ($myvar =~ /(pattern5)(pattern6)/) {
   ...
}

在 VB.NET 中,我通常将其转换为:

Dim re1 As New Regex("(pattern1)(pattern2)")
Dim re2 As New Regex("(pattern3)(pattern4)")
Dim re3 As New Regex("(pattern3)(pattern4)")
Dim m as match

if re1.IsMatch(myvar) Then
    m = re1.Match(myvar)
    var1 = m.Groups(1).Value
    var2 = m.Groups(2).Value
Else If re2.IsMatch(myvar) Then
    m = re2.Match(myvar)
    ...
Else If re3.IsMatch(myvar) Then
    m = re3.Match(myvar)
    ...
End

是否可以简化 .NET 等效项,使其不再寻找匹配成功,然后再次执行匹配,更类似于内联 Perl?我知道我可以创建多个匹配变量并提前执行匹配,但这仍然感觉很浪费,因为它提前执行所有匹配,而不是仅在需要时执行。

【问题讨论】:

  • 也许可以重做逻辑。进行匹配以获取 m,然后根据 m 的值执行条件

标签: regex vb.net perl


【解决方案1】:

在运行Regex.Match 后,您正在寻找Match.Success property。如果是true,可以访问组值:

Dim re1 As New Regex("(pattern1)(pattern2)")
Dim re2 As New Regex("(pattern3)(pattern4)")
Dim m as Match

m = re1.Match(myvar)
If (m.Success = True) Then
    var1 = m.Groups(1).Value
    var2 = m.Groups(2).Value
Else
    m = re2.Match(myvar)
    If (m.Success = True) Then
        var1 = m.Groups(1).Value
        var2 = m.Groups(2).Value
    End
End

【讨论】:

  • 这适用于简单的IF...ELSE... 条件。我要转换的 Perl 有多个 elseif 条件。我更新了我原来的问题以反映这一点。我实际上正在考虑在 Regex 对象上创建一个扩展方法,在那里执行匹配,返回匹配 ByRef,以及成功和函数结果。
  • @Matt 你可以从这里做任何你想做的事。这就是您如何使用单个匹配操作,然后在匹配时获取值。 Perl 不是 VB.NET,执行正则表达式匹配后没有任何“全局变量”。
猜你喜欢
  • 1970-01-01
  • 2013-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
相关资源
最近更新 更多