可以在这个 PowerShell 脚本中使用正则表达式吗?

Posted

技术标签:

【中文标题】可以在这个 PowerShell 脚本中使用正则表达式吗?【英文标题】:Could regex be used in this PowerShell script? 【发布时间】:2021-12-05 22:17:52 【问题描述】:

我有以下代码,用于从字符串 $m 中删除空格和其他字符,并将它们替换为句点('.'):

Function CleanupMessage([string]$m) 
  $m = $m.Replace(' ', ".")           # spaces to dot
  $m = $m.Replace(",", ".")           # commas to dot
  $m = $m.Replace([char]10, ".")      # linefeeds to dot

  while ($m.Contains("..")) 
    $m = $m.Replace("..",".")         # multiple dots to dot
  

  return $m

它工作正常,但它似乎有很多代码并且可以简化。我读过 regex 可以使用模式,但不清楚在这种情况下是否可行。有什么提示吗?

【问题讨论】:

【参考方案1】:

使用正则表达式字符类:

Function CleanupMessage([string]$m) 
  return $m -replace '[ ,.\n]+', '.'

解释

--------------------------------------------------------------------------------
  [ ,.\n]+                  any character of: ' ', ',', '.', '\n' (newline)
                           (1 or more times (matching the most amount
                           possible))

【讨论】:

很好,但是您缺少逐字匹配 . 字符:[ ,\n] -> [ ,\n.]【参考方案2】:

这种情况的解决方案:

cls
$str = "qwe asd,zxc`nufc..omg"

Function CleanupMessage([String]$m)

    $m -replace "( |,|`n|\.\.)", '.'


CleanupMessage $str

# qwe.asd.zxc.ufc.omg

通用解决方案。只需在$toReplace 中枚举你想替换什么:

cls
$str = "qwe asd,zxc`nufc..omg+kfc*fox"

Function CleanupMessage([String]$m)

    $toReplace = " ", ",", "`n", "..", "+", "fox"
    .
        $d = New-Guid
        $regex = [Regex]::Escape($toReplace-join$d).replace($d,"|")
        $m -replace $regex, '.'
    


CleanupMessage $str

# qwe.asd.zxc.ufc.omg.kfc*.

【讨论】:

以上是关于可以在这个 PowerShell 脚本中使用正则表达式吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何编写使用快捷方式关闭 PowerShell 的 AHK 脚本?

PowerCLI脚本,利用哈希表对参数进行转换

PowerShell命令与脚本(10)——脚本

MS Access 使用 Powershell 脚本插入 UTF-8

在Powershell脚本中安全的使用密码信息

如何在PowerShell脚本中嵌入EXE文件