PowerShell能否替换使用-clike找到的文本中区分大小写的部分?

PowerShell能否替换使用-clike找到的文本中区分大小写的部分?,powershell,replace,case-sensitive,Powershell,Replace,Case Sensitive,假设我有两个地址: 东北纽瓦克道123号 荷兰大道东北987号 我需要将方向部分从一个Ne更新到另一个Ne。但是,我不想将纽瓦克更新为纽瓦克,也不想将尼日兰更新为纽瓦克。我想我可以通过循环中的IF语句轻松找到所有实例: $testAddress = '123 Newark Road Ne' if (($testAddress -clike '* Ne') -or ($testAddress -clike '* Ne *')){ #code to replace Ne } 但我该如何替

假设我有两个地址:

  • 东北纽瓦克道123号
  • 荷兰大道东北987号
我需要将方向部分从一个Ne更新到另一个Ne。但是,我不想将纽瓦克更新为纽瓦克,也不想将尼日兰更新为纽瓦克。我想我可以通过循环中的IF语句轻松找到所有实例:

$testAddress = '123 Newark Road Ne'
if (($testAddress -clike '* Ne') -or ($testAddress -clike '* Ne *')){
   #code to replace Ne
}

但我该如何替换它呢?我不能用-creplace“*Ne”和“*Ne”。找到“*Ne”的索引只会给我-1,所以我认为我不能用它做任何事情。我确信有一个简单的概念我是不会遇到的。

通过使用
匹配计算器
,可以使用正则表达式将输入的某个部分替换为设计正则表达式(如.NET中的大写)中的替换操作数中不可能的内容,它在PowerShell中像脚本块一样构造

@('123 Newark Road Ne'
'987 Ne Netherland Avenue')|foreach{
    switch -regex ($_)
    {
        'Ne$'{$_ -replace 'Ne$','NE'}
        ' Ne '{$_ -replace ' Ne ',' NE '}
        Default {$_}
    }
}
使用MatchEvaluator,您可以根据需要操纵匹配的零件,因此在操纵时,您不受任何限制

从PowerShell 6开始,您甚至可以直接与
-replace
-creplace
操作符一起使用它。
低于6的PowerShell版本没有此选项,但仍然可以使用.NET正则表达式替换方法
[Regex]::Replace()
和MatchEvaluator

PS 5.1
$textToReplace='Ne 123纽瓦克路东北','123纽瓦克路东北','987 Ne荷兰大道'
foreach($textToReplace中的文本){
#将脚本块用作System.Text.RegularExpressions.MatchEvaluator
#param()部分是必需的。接下来的所有内容都是该特定匹配的返回

[regex]::Replace($text),(?您可以使用正则表达式将输入的某一部分替换为regex表达式中的替换操作数中不可能的内容(如.NET中的大写),方法是使用
MatchEvaluator
,它在PowerShell中构造为脚本块

使用MatchEvaluator,您可以根据需要操纵匹配的零件,因此在操纵时,您不受任何限制

从PowerShell 6开始,您甚至可以直接与
-replace
-creplace
操作符一起使用它。
低于6的PowerShell版本没有此选项,但仍然可以使用.NET正则表达式替换方法
[Regex]::Replace()
和MatchEvaluator

PS 5.1
$textToReplace='Ne 123纽瓦克路东北','123纽瓦克路东北','987 Ne荷兰大道'
foreach($textToReplace中的文本){
#将脚本块用作System.Text.RegularExpressions.MatchEvaluator
#param()部分是必需的。接下来的所有内容都是该特定匹配的返回

[regex]::替换($text),(?或在
Ne
周围使用单词边界:

'123 Newark Road Ne','987 Ne Netherland Avenue' | ForEach-Object {
    if ($_ -cmatch '(\bNe\b)') { $_ -creplace '(\bNe\b)', $Matches[1].ToUpper() }
    else { $_ }
}
输出

123 Newark Road NE
987 NE Netherland Avenue

或者在
Ne
周围使用单词边界:

'123 Newark Road Ne','987 Ne Netherland Avenue' | ForEach-Object {
    if ($_ -cmatch '(\bNe\b)') { $_ -creplace '(\bNe\b)', $Matches[1].ToUpper() }
    else { $_ }
}
输出

123 Newark Road NE
987 NE Netherland Avenue