Powershell:如果正则表达式不匹配,请单独保留项目

时间:2009-06-18 16:33:12

标签: regex powershell

我有一个pdf文件列表(来自日常处理),有些带有各种格式的日期戳,有些没有。

示例:

$f = @("testLtr06-09-02.pdf", "otherletter.pdf","WelcomeLtr043009.pdf")

我试图通过删除短划线删除日期戳,然后用字符串“DATESTAMP”替换任何连续的数字组(4或更多,我可以将其更改为6)。

到目前为止,我有这个:

$d =  $f | foreach {$_ -replace "-", ""} | foreach { $_ -replace ([regex]::Matches($_ , "\d{4,}")), "DATESTAMP"}
echo $d

输出:

testLtrDATESTAMP.pdf
DATESTAMPoDATESTAMPtDATESTAMPhDATESTAMPeDATESTAMPrDATESTAMPlDATESTAMPeDATESTAMPtDATESTAMPtDATESTAMPeDATESTAMPrDATESTAMP.DATESTAMPpDATESTAMPdDATESTAMPfDATESTAMP
WelcomeLtrDATESTAMP.pdf

如果文件有一个日期戳,它可以正常工作,但它似乎吓坏了-replace并在每个字符后插入DATESTAMP。有没有办法来解决这个问题?我试图将它改为foreach循环,但我无法弄清楚如何从正则表达式获得true / false。

提前致谢。

2 个答案:

答案 0 :(得分:4)

您可以这样做:

PS > $f -replace "(\d{2}-){2}\d{2}|\d{4,}","DATESTAMP"
testLtrDATESTAMP.pdf
otherletter.pdf
WelcomeLtrDATESTAMP.pdf

答案 1 :(得分:2)

$_ -replace ([regex]::Matches($_ , "\d{4,}")), "DATESTAMP"

$ _中的含义用([regex]::Matches($_ , "\d{4,}"))替换"DATESTAMP"的每个发现。

在没有时间戳(或至少4个连续数字)的文件名中没有匹配,它返回""(空字符串)。

因此,每个空字符串都被DATESTAMP替换。这样一个空字符串""位于字符串的开头和每个其他字符之后。

这就是为什么你得到DATESTAMP所包围的每个角色的长字符串。


要检查字符串中是否存在\d{4,},您应该可以使用

[regex]::IsMatch($_, "\d{4,}")

我不是Powershell用户,但仅此一行应该可以胜任。但是我不确定是否能够在管道中使用if而不管分配和回声$ d是否需要

$f | foreach-object {$_ -replace "-", ""} | foreach-object {if ($_ -match "\d{4,}") { $_ -replace "\d{4,}", "DATESTAMP"} else { $_ }}