PowerShell正则表达式分组

时间:2013-06-04 22:30:09

标签: regex powershell

我在PowerShell中制作重命名脚本时遇到了一些麻烦。 情况: 在目录中,我有以下列格式命名的文件夹: “四位数 - 文字 - 垃圾” 我要重命名为 “文字(四位数)”

现在我已经创建了一个目录,其中包含一些样本名称:

1996年 - 一些有趣的东西 - 一些蹩脚的东西

2006 - 复制此 - 忽略

我已经尝试设置一个脚本来回显他们的名字,但我不能完全掌握正则表达式。以下代码只打印“1996 - something”和“2006 - copy”

Get-ChildItem | Foreach-Object { if ($_.BaseName -match "(\d{4} - \w+ -*)") { echo $matches[0]}}

这个将打印“1996 - 有趣的东西 - 有点蹩脚\ n()”和“2006 - 复制此 - 忽略\ n()”

Get-ChildItem | Foreach-Object { echo ($_.BaseName -replace "(\d{4} - \w+ - *)"), "$2 ($1)"}

有人可以告诉我为什么这两种方法都不会将文字字符串“ - ”视为匹配的边界吗?

*编辑* 谢谢zespri,解决我问题的代码是

Get-ChildItem | Foreach-Object {
if ($_.BaseName -match "(\d{4} - [^-]*)") { 
  Rename-Item $_ ($_.BaseName -replace "(\d{4}) - (.+)(?= -).*" ,'$2 ($1)')
  }
}

2 个答案:

答案 0 :(得分:5)

这对你有用吗?

Get-ChildItem | Foreach-Object { 
  if ($_.BaseName -match "(\d{4} - [^-]*)") { 
      echo $matches[0].TrimEnd()
    }
}

注意TrimEnd - 这是在第二个破折号之前修剪尾随空格。

至于为什么你的例子不起作用:\ w +匹配任何单词字符,因此它与“有趣的东西”里面的空格不匹配。 *表示零或更多。所以 - *匹配零个或多个破折号,在你的情况下为零。

编写可能适合您的表达式的另一种方法是:

Get-ChildItem | Foreach-Object { 
  if ($_.BaseName -match "(\d{4} - .+(?= -))") { 
      echo $matches[0]
    }
}

(?= -)结构为positive lookahead assertion的位置 在这种情况下,您不需要修剪末尾的额外空间,因为它在正则表达式中占用。

更新1

修改以进行转换:

gci | %{ $_.BaseName -replace "(\d{4}) - (.+)(?= -).*" ,'$2 ($1)' }

答案 1 :(得分:1)

试试这个:

Get-ChildItem | 
    Select-String -Pattern '(\d{4})\s+-\s+(\w+(\s+\w+)*)\s+-.*' |
    Foreach-Object { "$($_.Matches.Groups[2].Value) ($($_.Matches.Groups[1].Value))" }