我有一个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。
提前致谢。
答案 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 { $_ }}