使用正则表达式匹配组重命名 Powershell

Xas*_*ser 4 regex powershell

我正在努力编写一个执行以下操作的 Powershell 命令。假设有一个文件夹,其中包含一堆随机名称匹配正则表达式模式的文件。我想捕获与模式匹配的部分并将文件重命名为该部分。

例如,如果模式是\w\d+\w+\d+(或类似的),“asdjlk-c12aa13-.pdf”应该变成“c12aa13.pdf” 。

我目前的想法是这样的:

Get-ChildItem | Rename-Item -NewName { $_.Name -match $pattern ... } -WhatIf

where...需要替换为将代码块的“值”(即 NewName)设置为匹配组的内容。即我不知道如何$matched-match命令后直接访问。

另外,我想知道是否可以使用-match,进行延迟匹配,.*?这似乎不起作用。

mkl*_*nt0 5

虽然您可以-match通过自动$Matches变量跟踪操作并随后提取匹配的部分,但在操作员的帮助下将这两个操作组合起来通常更容易-replace

你只需要确保的是,为了只返回感兴趣的部分,则必须输入字符串匹配完全不关心的部分,然后忽略:

PS> 'asdjlk-c12aa13-.pdf' -replace '^.*?(\w\d+\w+\d+).*?(\.pdf)$', '$1$2'
c12aa13.pdf
Run Code Online (Sandbox Code Playgroud)
  • ^.*? (懒惰地)匹配感兴趣部分之前的前缀。

  • (\w\d+\w+\d+)匹配感兴趣的部分,包裹在一个捕获组中;由于它是正则表达式中的第一个捕获组,您可以参考它$1在替换操作数中捕获的内容。

  • .*?(懒惰地)匹配.pdf文件扩展名之后的所有内容。

  • (\.pdf)$匹配.pdf名称末尾的文件扩展名,作为第二个捕获组,可以$2在替换操作数中引用。

  • $1$2 简单地连接 2 个捕获组匹配以输出所需的名称。

    • 注意:通常,对正则表达式和替换操作数都使用单引号字符串,这样$就不会被PowerShell事先意外解释。

    • 有关-replace替换操作数的更多信息和语法,请参阅我的这个答案


您的命令上下文中的解决方案:

Get-ChildItem |
  Rename-Item -NewName { $_.Name -replace '^.*?(\w\d+\w+\d+).*?(\.pdf)$', '$1$2' } -WhatIf
Run Code Online (Sandbox Code Playgroud)