Powershell正则表达式替换表达式

时间:2015-10-22 04:36:15

标签: regex powershell

我已经遵循了本文中出色的解决方案:

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]'

我做错了什么?我尝试使用\作为转义字符。

1 个答案:

答案 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