gpt4 book ai didi

regex - PowerShell 正则表达式分组

转载 作者:行者123 更新时间:2023-12-04 18:44:46 25 4
gpt4 key购买 nike

我在 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)')
}
}

最佳答案

这对你有用吗:

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)' }

关于regex - PowerShell 正则表达式分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16928590/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com