我了解.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
答案 0 :(得分:3)
-Replace
是一个powershell运算符,它将X替换为Y,并且无法配置为执行其他操作。
[Regex]
是一个.NET类,它包含一个名为Replace
的方法,并且具有许多重载,可以配置和控制如何替换字符串。
-replace
可能在幕后使用[Regex]::Replace
。
从Regex.Replace
到reference的方法包含了许多可以被调用的方法。
Regex类中包含的methods and properties。
答案 1 :(得分:2)
The Fish's helpful answer包含了很好的指针,但是让我对框架进行一些不同的设计,部分受Ansgar Wiechers'评论的启发:
PowerShell的 -replace
operator是 .NET {{ 3}} 方法。
默认行为的一个重要区别是 -replace
默认情况下不区分大小写 ,与PowerShell的总体行为一致。
-creplace
替换区分大小写的 。 -replace
仅提供由各种[Regex]::Replace()
重载提供的功能的子集 。
-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的功能。