PowerShell 正規表現を使ってコマンド一本で文字列抽出

テキストファイルから正規表現使って文字列抽出したい場合、
PowerShellからこんなコマンドで一発で抽出できます。

[regex]::Matches((Get-Content 対象のファイル),"正規表現文字列","任意オプション") | foreach{$_.Value}

 

例えばXMLからCDATAの値を抽出してみます。

[regex]::Matches((Get-Content .\test.xml),"CDATA\[.*?\]") | foreach{$_.Value}


結果はこのようなイメージになります。

CDATA[XXX]
CDATA[XXXXXX]
CDATA[SSS]
CDATA[YYYYYY]

 
 

もし、PowerShellだけで書くならこんな方法もあります。

PS>(get-content .\test.xml).foreach{if($_ -match "CDATA\[.*?\]"){$matches[0]}}


これは、$matchesという-matchを使った時に自動的に設定される変数を使った方法です。



正規表現検索のオプションとして指定できるのは以下のコマンドで取得できます。

[System.Text.RegularExpressions.RegexOptions]::GetNames([System.Text.RegularExpressions.RegexOptions])

結果はこちら。

None
IgnoreCase
Multiline
ExplicitCapture
Compiled
Singleline
IgnorePatternWhitespace
RightToLeft
ECMAScript
CultureInvariant


それぞれの意味はこちら。

オプション 説明
IgnoreCase 検索時に大文字と小文字を区別しないことを指定します。
Multiline 複数行モードを指定します。 ^ と $ の意味を変更して、文字列全体の先頭と末尾だけでなく、任意の行の先頭と末尾にもそれぞれが一致するようにします。
ExplicitCapture 明示的に名前または番号を指定された (?...) の形式のグループだけが有効なキャプチャであることを指定します。 これにより、名前のないかっこは表現 (?:...) に構文上の間違いがなくても、非キャプチャ グループとして機能するようになります。
Compiled 正規表現コンパイルしてアセンブリを作成することを指定します。 これにより実行速度は速くなりますが、起動にかかる時間は長くなります。
Singleline 単一行モードを指定します。 \n 以外の任意の文字ではなく、すべての文字と一致するようにピリオド (.) の意味を変更します。
IgnorePatternWhitespace パターンからエスケープが解除された空白を削除し、# でマークされたコメントを有効にします。 ただし、IgnorePatternWhitespace 値は 文字クラス内の空白には影響しないため、文字クラスから空白が削除されることはありません。
RightToLeft 検索が左から右ではなく右から左に行われるように指定します。
ECMAScript 式の ECMAScript 準拠の動作を有効にします。 この値は、必ず IgnoreCase、Multiline、Compiled の各値と組み合わせて使用します。
CultureInvariant 言語の違いが無視されるように指定します。

RegexOptions 列挙体 (System.Text.RegularExpressions)から引用



Windowsサーバー上でもそのまま利用できるので、ログ解析なんかにも便利です。