about_Regular_Expressions

簡単な説明

PowerShell の正規表現について説明します。

詳細な説明

Note

この記事では、PowerShell で正規表現を使用するための構文とメソッドについて説明します。 考えられるすべての式を網羅しているわけではありません。 詳細なリファレンスについては、「 Regular 式言語 - クイック リファレンスを参照してください。

正規表現は、テキストの照合に使用されるパターンです。 リテラル文字、演算子、およびその他のコンストラクトで構成できます。

この記事では、PowerShell の正規表現の構文について説明します。 PowerShell には、正規表現を使用するいくつかの演算子とコマンドレットがあります。 構文と使用法の詳細については、以下のリンクを参照してください。

PowerShell 正規表現では、既定では大文字と小文字が区別されません。 上記の各方法では、大文字と小文字の区別を強制する方法が異なります。

  • Select-Stringの場合は、CaseSensitive パラメーターを使用します。
  • 正規表現を使用する演算子の場合は、大文字と小文字を区別するバージョン ( -cmatch-creplace、または -csplit
  • switch ステートメントでは、-casesensitive オプションを使用します

文字リテラル

正規表現には、リテラル文字または文字列を指定できます。 この式により、エンジンは指定されたテキストと正確に一致します。

# This statement returns true because book contains the string "oo"
'book' -match 'oo'

文字クラス

文字リテラルは正確なパターンがわかっている場合に機能しますが、文字クラスを使用すると、あまり具体的ではありません。

文字グループ

[character group] では、任意の数の文字を一度に一致させることができますが、 [^character group] はグループ内にない文字にのみ一致します。

# This expression returns true if the pattern matches big, bog, or bug.
'big' -match 'b[iou]g'

一致する文字のリストにハイフン文字 (-) が含まれている場合、文字範囲式と区別するには、リストの先頭または末尾にある必要があります。

文字範囲

パターンには、文字の範囲を指定することもできます。 文字には、英字 [A-Z]、数値 [0-9]、または ASCII ベースの [ -~] (印刷可能なすべての文字) を指定できます。

# This expression returns true if the pattern matches any 2 digit number.
42 -match '[0-9][0-9]'

数値

\d文字クラスは、任意の 10 進数字と一致します。 逆に、 \D は 10 進数以外の数字と一致します。

# This expression returns true if it matches a server name.
# (Server-01 - Server-99).
'Server-01' -match 'Server-\d\d'

Word 文字

\w文字クラスは、任意の単語文字[a-zA-Z_0-9]と一致します。 単語以外の文字と一致するには、 \Wを使用します。

# This expression returns true.
# The pattern matches the first word character 'B'.
'Book' -match '\w'

ワイルドカード

ピリオド (.) は正規表現のワイルドカード文字です。 改行 (\n) を除く任意の文字と一致します。

# This expression returns true.
# The pattern matches any 4 characters except the newline.
'a1\ ' -match '....'

空白

任意の空白文字を \s 文字クラスと照合できます。 空白以外の文字は、 \Sと一致させることができます。 リテラル・スペース文字を と一致させることができます。

# This expression returns true.
# The pattern uses the whitespace character class to match the leading
# space and a literal space to matching the trailing space.
' - ' -match '\s- '

量指定子

量指定子は、入力文字列に存在する各要素のインスタンスの数を制御します。

PowerShell で使用できる量指定子の一部を次に示します。

量指定子 説明
* 0 回以上。
+ 1 回以上。
? 0 または 1 回。
{n,m} 少なくとも nですが、 m 回以下です。

アスタリスク (*) は、前の要素と 0 回以上一致します。 結果として、要素のない入力文字列でも一致することになります。

# This returns true for all account name strings even if the name is absent.
'ACCOUNT NAME:    Administrator' -match 'ACCOUNT NAME:\s*\w*'

プラス記号 (+) は、前の要素と 1 回以上一致します。

# This returns true if it matches any server name.
'DC-01' -match '[A-Z]+-\d\d'

疑問符 ? は、前の要素 0 または 1 回に一致します。 アスタリスク *と同様に、要素が存在しない文字列にも一致します。

# This returns true for any server name, even server names without dashes.
'SERVER01' -match '[A-Z]+-?\d\d'

{n, m}量指定子は、量指定子をきめ細かく制御するために、いくつかの異なる方法で使用できます。 2 番目の要素 m とコンマ , は省略可能です。

量指定子 説明
{n} 正確に n 回数と一致します。
{n,} 少なくとも n 回数に一致します。
{n,m} nm回数の間で一致します。
# This returns true if it matches any phone number.
'111-222-3333' -match '\d{3}-\d{3}-\d{4}'

アンカー

アンカーを使用すると、入力文字列内の一致位置に基づいて、一致を成功または失敗させることができます。

一般的に使用される 2 つのアンカーは、 ^$です。 キャレット ^ は文字列の先頭と一致し、 $は文字列の末尾と一致します。 アンカーを使用すると、特定の位置でテキストを照合しながら、不要な文字も破棄できます。

# The pattern expects the string 'fish' to be the only thing on the line.
# This returns FALSE.
'fishing' -match '^fish$'

Note

アンカー ($ ) を含む正規表現を定義するときは、正規表現を一重引用符 (') で囲む必要があります。 二重引用符 (") を使用する場合、PowerShell は文字列を展開可能な変数式として解釈します。

PowerShell でアンカーを使用する場合は、正規表現オプション SinglelineMultiline の違いを理解する必要があります。

  • 複数行: 複数行モードでは、入力文字列の先頭と末尾ではなく、 ^$ がすべての LINE の先頭の末尾と一致するように強制されます。
  • 単一行: 単一行モードでは、入力文字列が SingleLine として扱われます。 .文字は、改行\nを除くすべての文字と一致するのではなく、すべての文字 (改行を含む) に強制的に一致させます。

これらのオプションとその使用方法の詳細については、「 Regular 式言語 - クイック リファレンス」を参照してください

文字のエスケープ

バックスラッシュ (\) は、正規表現エンジンによって解析されないように文字をエスケープするために使用されます。

次の文字が予約されています: []().\^$|?*+{}

入力文字列内の文字と一致させるために、パターンでこれらの文字をエスケープする必要があります。

# This returns true and matches numbers with at least 2 digits of precision.
# The decimal point is escaped using the backslash.
'3.141' -match '3\.\d{2,}'

テキストをエスケープできる正規表現クラスの静的メソッドがあります。

[regex]::escape('3.\d{2,}')
3\.\\d\{2,}

Note

これにより、文字クラスで使用されている既存の円記号を含め、予約されたすべての正規表現文字がエスケープされます。 必ず、エスケープする必要があるパターンの部分でのみ使用してください。

その他の文字エスケープ

特殊文字の種類に合わせて使用できる予約文字エスケープもあります。

一般的に使用される文字エスケープをいくつか次に示します。

文字エスケープ 説明
\t タブと一致します
\n 改行に一致します
\r 復帰に一致します。

グループ、キャプチャ、置換

グループ化コンストラクトは、キャプチャまたは無視できる部分文字列に入力文字列を分離します。 グループ化された部分文字列は、部分式と呼ばれます。 既定では、部分式は番号付きグループにキャプチャされますが、名前を割り当てることもできます。

グループ化コンストラクトは、かっこで囲まれた正規表現です。 囲まれた正規表現で一致するテキストがキャプチャされます。 次の例では、入力テキストを 2 つのキャプチャ グループに分割します。

'The last logged on user was CONTOSO\jsmith' -match '(.+was )(.+)'
True

キャプチャされたテキストを取得するには、 $Matches Hashtable 自動変数を使用します。 一致全体を表すテキストは、キー 0に格納されます。 $Matchesハッシュテーブルには、一致するパターンの最初の出現のみが含まれていることに注意してください。

$Matches.0
The last logged on user was CONTOSO\jsmith

キャプチャは、左から右に増える数値 Integer キーに格納されます。 キャプチャ 1 には、ユーザー名までのすべてのテキストが含まれます。キャプチャ 2 にはユーザー名だけが含まれます。

$Matches
Name           Value
----           -----
2              CONTOSO\jsmith
1              The last logged on user was
0              The last logged on user was CONTOSO\jsmith

重要

0 キーは Integer です。 任意の Hashtable メソッドを使用して、格納されている値にアクセスできます。

PS> 'Good Dog' -match 'Dog'
True

PS> $Matches[0]
Dog

PS> $Matches.Item(0)
Dog

PS> $Matches.0
Dog

名前付きキャプチャ

既定では、キャプチャは左から右の昇順で格納されます。 をキャプチャ グループに割り当てることもできます。 この name は、 $Matches Hashtable 自動変数のキーになります。

キャプチャ グループ内で、 ?<keyname> を使用して、キャプチャされたデータを名前付きキーの下に格納します。

PS> $string = 'The last logged on user was CONTOSO\jsmith'
PS> $string -match 'was (?<domain>.+)\\(?<user>.+)'
True

PS> $Matches

Name                           Value
----                           -----
domain                         CONTOSO
user                           jsmith
0                              was CONTOSO\jsmith

PS> $Matches.domain
CONTOSO

PS> $Matches.user
jsmith

次の例では、最新のログ エントリを Windows セキュリティ ログに格納します。 指定された正規表現は、メッセージからユーザー名とドメインを抽出し、名前とドメインのDの keys:N の下に格納します。

$log = (Get-EventLog -LogName Security -Newest 1 -InstanceId 4689).message
$r = '(?s).*Account Name:\s*(?<N>.*).*Account Domain:\s*(?<D>[A-Z,0-9]*)'
$log -match $r
True
$Matches
Name                           Value
----                           -----
D                              CONTOSO
N                              jsmith
0                              A process has exited....

詳細については、「正規表現での 構成体のグループ化」を参照してください。

正規表現での置換

正規表現 (regex) と -replace 演算子を使用すると、キャプチャされたテキストを使用してテキストを動的に置き換えることができます。

<input> -replace <original>, <substitute>

  • <input>: 検索する文字列
  • <original>: 入力文字列を検索するために使用される正規表現
  • <substitute>: 入力文字列内の一致を置換する正規表現置換式。

<original>および<substitute>オペランドは、文字エスケープ式や置換式などの正規表現エンジンの規則の対象となります。 置換パターンは、1 個以上の置換と、リテラル文字で構成されます。

キャプチャ グループは、グループ識別子の前の$文字を使用して、<substitute>文字列で参照できます。

キャプチャ グループを参照するには、 NumberName の 2 つの方法があります。

  • by Number - キャプチャ グループには左から右に番号が付けられます。

    'John D. Smith' -replace '(\w+) (\w+)\. (\w+)', '$1.$2.$3@contoso.com'
    
    John.D.Smith@contoso.com
    
  • by Name - Capture Groups を名前で参照することもできます。

    'CONTOSO\Administrator' -replace '\w+\\(?<user>\w+)', 'FABRIKAM\${user}'
    
    FABRIKAM\Administrator
    

$&式は、一致したすべてのテキストを表します。

'Gobble' -replace 'Gobble', '$& $&'
Gobble Gobble

警告

$文字は文字列拡張で使用されるため、置換でリテラル文字列を使用するか、二重引用符を使用する場合は$文字をエスケープする必要があります。

'Hello World' -replace '(\w+) \w+', '$1 Universe'
"Hello World" -replace "(\w+) \w+", "`$1 Universe"
Hello Universe
Hello Universe

さらに、 $ をリテラル文字として使用する場合は、通常のエスケープ文字の代わりに $$ を使用します。 二重引用符を使用する場合でも、誤った置換を回避するために、 $ のすべてのインスタンスをエスケープします。

'5.72' -replace '(.+)', '$$$1'
"5.72" -replace "(.+)", "`$`$`$1"
$5.72
$5.72

置換式の詳細については、「正規表現の Substitutions」を参照してください。

関連項目