2013-06-04 5 views
5

PowerShellで名前の変更スクリプトを作成するのにかなり問題があります。 状況: 「4桁の数字 - テキスト - ジャンク」 私は に名前を変更したい「テキスト(4桁)」今、私が作成したPowerShell regex grouping

:私は、次の形式で指定のフォルダを持っているディレクトリで 遊ぶためにいくつかのサンプルの名前を持つディレクトリ: - 何か面白いもの -

2006安っぽい何か - これをコピーする -

1996年、私は彼らをエコーするスクリプトを設定しようとしました

を無視します名前は始まりますが、私は正規表現のハングアップを得ることはできません。次のコードは、単にプリント "1996 - 何か" と "2006 - コピー"

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

と印刷されます。この1 "1996 - 何か面白いもの - 何か安っぽい\ nを()" と「2006 - これはコピー - 無視\ N()」どちらのアプローチは、文字列リテラル尊重なぜ

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

誰かが私を伝えることができ、 『 - 』のマッチングのための境界としての?

* EDIT * おかげzespri、私の問題を解決したコードは、あなたのためにこの作品

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

答えて

5

を予定されています

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

注TrimEnd - これは前に末尾のスペースをトリミングすることです二番目のダッシュ。

あなたの例がうまくいかない理由は:\ w +は任意の単語文字と一致するので、「何か興味深い」内部のスペースとは一致しません。 *はゼロ以上を意味します。 So - *は、0個以上のダッシュと一致します。

あなたのために働くかもしれない式を記述するための別の方法は次のとおりです。(?= -)構築物は、それが計上され、この場合にはpositive lookahead assertion は、あなたが最後に余分なスペースをトリミングする必要がないです

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

正規表現自体のために。変換を行うように変更

アップデート1

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

を、それがステップです正しい方向。今すぐ何かをする:「何か興味深い(数字)」に再フォーマットする。私はかっこで抽出し、$ matches [0] .Groups []で抽出する2つの部分をラップしようとしました。[]ála http://stackoverflow.com/questions/614651/how-do-you-extract-the -value-of-a-regex-backreference-match-in-powershellですが、これは有効な演算子ではありません。私はまた名前付きグループと名前のないグループを使ってみましたが、テキスト全体以外のもの、または括弧の空のペアとそれに続く迷惑メールはありません。 – Glader

+0

@Glader:私は、正しい方向の優しい振る舞いで十分だろうと思っていました。私は、名前を再フォーマットするコードを追加する答えを修正しました。 –

+0

だから、私は私の人生のために適切な方法を理解することはできませんでした..最初の正規表現に複数のor'ed文字の要求などを追加することによって試してみましたが、 ^^本当にありがとうございました。元の投稿を私が行ったコードで更新しました。 – Glader

0

このお試しください:それはそうと一致するものの名​​前をエコーし​​ます

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