我已经遵循了本文中出色的解决方案:
PowerShell multiple string replacement efficiency
尝试规范从Active Directory导入的电话号码。这是一个例子:
$telephoneNumbers = @(
'+61 2 90237534',
'04 2356 3713'
'(02) 4275 7954'
'61 (0) 3 9635 7899'
'+65 6535 1943'
)
# Build hashtable of search and replace values.
$replacements = @{
' ' = ''
'(0)' = ''
'+61' = '0'
'(02)' = '02'
'+65' = '001165'
'61 (0)' = '0'
}
# Join all (escaped) keys from the hashtable into one regular expression.
[regex]$r = @($replacements.Keys | foreach { [regex]::Escape( $_ ) }) -join '|'
[scriptblock]$matchEval = { param( [Text.RegularExpressions.Match]$matchInfo )
# Return replacement value for each matched value.
$matchedValue = $matchInfo.Groups[0].Value
$replacements[$matchedValue]
}
# Perform replace over every line in the file and append to log.
$telephoneNumbers |
foreach {$r.Replace($_,$matchEval)}
我在$replacements
哈希表中格式化匹配表达式时遇到问题。例如,我希望匹配所有+61
个号码并替换为0
,并匹配所有其他+
个号码,并替换为0011
。
我尝试过以下正则表达式,但它们似乎并不匹配:
'^+61'
'^+[^61]'
我做错了什么?我尝试使用\
作为转义字符。
答案 0 :(得分:2)
我已经对此进行了一些重新安排,我不确定它是否适用于您的整个情况,但它为该示例提供了正确的结果。
我认为关键不是尝试从哈希表创建一个大的正则表达式,而是循环它并根据电话号码检查它中的值。
我做的唯一其他更改是将' ',''
替换从哈希移动到打印替换电话号码的代码中,因为您希望在每个方案中运行此代码。
代码如下:
$telephoneNumbers = @(
'+61 2 90237534',
'04 2356 3713'
'(02) 4275 7954'
'61 (0) 3 9635 7899'
'+65 6535 1943'
)
$replacements = @{
'(0)' = ''
'+61' = '0'
'(02)' = '02'
'+65' = '001165'
}
foreach ($t in $telephoneNumbers) {
$m = $false
foreach($r in $replacements.getEnumerator()) {
if ( $t -match [regex]::Escape($r.key) ) {
$m = $true
$t -replace [regex]::Escape($r.key), $r.value -replace ' ', '' | write-output
}
}
if (!$m) { $t -replace ' ', '' | write-output }
}
给出:
0290237534
0423563713
0242757954
61396357899
00116565351943