2009-06-18 9 views
1

私は日々の処理からpdfファイルのリストを持っていますが、いくつかはさまざまな書式設定の日付スタンプを含んでいます。Powershell:正規表現が一致しない場合は項目を残してください

例:

$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ループに変更しようとしましたが、正規表現から真偽を取得する方法を理解できませんでした。

ありがとうございます。 $で

答えて

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

手段_ "DATESTAMP"([regex]::Matches($_ , "\d{4,}"))のすべての発見を交換してください。

タイムスタンプのないファイル(または少なくとも4つの連続する数字)に一致するものはないので、""(空の文字列)を返します。

したがって、すべての空の文字列はDATESTAMPに置き換えられます。そしてそのような空の文字列""は、文字列の先頭と1文字おきに位置します。

DATESTAMPで囲まれたすべての文字でこの長い文字列を取得する理由は何ですか?


も、あなたが

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

を使用できるはずあなたの文字列に\d{4,}が存在するかどうかを確認するために、私はPowerShellのユーザーまったくだんが、これだけの行は、仕事をする必要があります。しかし、私は

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

感謝を!私はそれが私がループバージョンで探していたものだと思う。 foreach($ fの$ item)に切り替えることなく、IsMatchを単一の文で使用するために、caseまたはif節に似た何かをする方法がありますか? – wtjones

+0

[正規表現]の代わりに-match演算子を使うこともできます::一致します。少し短くて読みやすいはずです。 – Joey

+0

私の答えは、私がうまくいくと思うものに更新されました。しかし、私はpowershellユーザーではなく、パイプラインのif-elseステートメントは許可されない可能性があることに注意してください。 – jitter

4

を必要としているパイプラインと天気をかを割り当て、エコー$(d)であれば使用することができることについてはよく分からないあなたは、単に行うことができます。

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

これも完全に機能します。しかし、私は正規表現の上でそれをいくつかの意味を作るためにブラッシュする必要があります:) ありがとう!私は必要なポイントを得るとすぐにこれをバンプします。 – wtjones

関連する問題