[Regex] :: Replace()和-replace有什么区别?

时间:2018-09-14 13:13:34

标签: regex powershell replace

我了解.Replace()-replace之间的区别,但是-replace[Regex]::Replace()是什么?

我测试了以下两个代码,但对我来说结果是完全相同的。

我还提到了PowerShell Cookbook(O'reilly),它说

  

([Regex]是)非常高级的正则表达式替换

我想知道[Regex]可以做什么,但-replace不能。

$line = "Loosen the socket by turning it#counterclockwise."
$line = $line -Replace "([a-z])#([a-z])","`$1 `$2"
$line

# Loosen the socket by turning it counterclockwise.

$line.GetType()
# IsPublic IsSerial Name                                     BaseType
# -------- -------- ----                                     --------
# True     True     String                                   System.Object

$line2 = "Loosen the socket by turning it#counterclockwise."
$line2 = [Regex]::Replace($line3,"([a-z])#([a-z])","`$1 `$2")
$line2

# Loosen the socket by turning it counterclockwise.

$line2.GetType()
# IsPublic IsSerial Name                                     BaseType
# -------- -------- ----                                     --------
# True     True     String                                   System.Object

2 个答案:

答案 0 :(得分:3)

-Replace是一个powershell运算符,它将X替换为Y,并且无法配置为执行其他操作。

[Regex]是一个.NET类,它包含一个名为Replace的方法,并且具有许多重载,可以配置和控制如何替换字符串。

-replace可能在幕后使用[Regex]::Replace

Regex.Replacereference的方法包含了许多可以被调用的方法。

Regex类中包含的methods and properties

答案 1 :(得分:2)

The Fish's helpful answer包含了很好的指针,但是让我对框架进行一些不同的设计,部分受Ansgar Wiechers'评论的启发:

  • PowerShell的 -replace operator .NET {{ 3}} 方法

    • 鉴于PowerShell是基于.NET框架构建的,这是PowerShell以更简单,更高级的方式显示.NET功能的一种常见模式。
  • 默认行为的一个重要区别是 -replace默认情况下不区分大小写 ,与PowerShell的总体行为一致。

  • >
    • 使用变体-creplace替换区分大小写的
  • -replace仅提供由各种[Regex]::Replace()重载提供的功能的子集

    • PowerShell Core v6.1.0 +中的功能差距已缩小,该功能现在还通过传递给-replace的脚本块提供了 callback 功能,这要归功于由[Regex]::Replace()工作;例如,
      '1 + 1 = 2' -replace '\d+', { [int] $_.Value * 2 }产生'2 + 2 = 4',它等效于:
      [regex]::replace('1 + 1 = 2', '\d+', { param($match) [int] $match.Value * 2 })
  • 如果对于给定的用例,-replace足够好,请使用 it 而不是[regex]::Replace()

    • 方法调用的语法不同于其他PowerShell,并且在类型转换和代码的长期稳定性方面存在细微差别。因此,如果可行,通常最好坚持使用本机PowerShell功能(cmdlet和运算符)。

    • 但是,如果-replace无法提供您所需的功能,则直接调用[regex]::Replace()是一个不错的高级选择;请注意,Replace()还作为 instance 方法存在,在这种情况下,它提供了附加功能-例如,Mathias R. Jessen的功能。