我理解.Replace()
和-replace
之间的区别,但-replace
和[Regex]::Replace()
是什么?
我测试了以下2个代码,但对我来说结果完全相同。
我还提到了PowerShell Cookbook(O'reilly),它说
([正则表达式]是)非常高级的正则表达式替换
我想知道什么[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
The Fish's helpful answer包含很好的指针,但让我对事物的框架有所不同,部分原因是Ansgar Wiechers的评论:
-replace
operator是.NET [Regex]::Replace()
方法的友好包装器。
鉴于PowerShell是基于.NET框架构建的,因此PowerShell以更简单,更高级的方式表现.NET功能是一种常见模式。-replace
默认情况下是不区分大小写的,与PowerShell的行为一致。
使用变量-creplace
进行区分大小写的替换。-replace
仅提供各种[Regex]::Replace()
重载提供的功能的子集。
PowerShell Core v6.1.0 +中的功能差距已缩小,现在还通过传递给-replace
的脚本块提供回调功能,这得益于Mathias R. Jessen的工作;例如。,
'1 + 1 = 2' -replace '\d+', { [int] $_.Value * 2 }
产生'2 + 2 = 4'
,相当于:
[regex]::replace('1 + 1 = 2', '\d+', { param($match) [int] $match.Value * 2 })
-replace
对于给定的用例足够好,请使用它而不是[regex]::Replace()
。
方法调用的语法与PowerShell的其他部分不同,并且在类型转换和代码的长期稳定性方面存在细微之处;因此,如果可行的话,通常最好坚持使用本机PowerShell功能(cmdlet和运算符)。
但是,如果-replace
不提供您所需的功能,直接调用[regex]::Replace()
是一个很好的高级选项;请注意,Replace()
也作为实例方法存在,在这种情况下它提供了额外的功能 - 例如,limit the number of replacements的能力。-Replace
是一个powershell运算符,用X替换X,不能配置为执行任何其他操作。
[Regex]
是一个.NET类,它包含一个名为Replace
的方法,并且有许多重载,可以配置和控制字符串的替换方式。
-replace
可能在引擎盖下使用[Regex]::Replace
。
reference到Regex.Replace
方法包含所有可以被称为的不同方式。
正则表达式中包含的methods and properties。