about_Regular_Expressions
簡単な説明
PowerShell の正規表現について説明します。
長い説明
注意
この記事では、PowerShell で正規表現を使用するための構文とメソッドについて説明します。すべての構文について説明するわけではありません。 より完全なリファレンスについては、「 正規表現言語 - クイック リファレンス」を参照してください。
正規表現は、テキストの照合に使用されるパターンです。 リテラル文字、演算子、およびその他のコンストラクトで構成できます。
この記事では、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 both methods to match the 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} |
n と の回数をm 一致させます。 |
# 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$'
注意
アンカーを含む$
正規表現を定義する場合は、二"
重引用符 () ではなく単一引用符 ('
) を使用して正規表現を囲んでください。または、PowerShell によって式が変数として展開されます。
PowerShell でアンカーを使用する場合は、 単一行 と 複数 行の正規表現オプションの違いを理解する必要があります。
- 複数行: 複数行モード
^
では、入力文字列の先頭と$
末尾ではなく、すべての LINE の先頭の末尾と一致するように強制されます。 - 単一行: 単一行モードでは、入力文字列が SingleLine として扱われます。
改行を
.
除くすべての文字と一致するのではなく、すべての文字 (改行を含む) に文字を強制的に\n
一致させます。
これらのオプションとその使用方法の詳細については、「 正規表現言語 - クイック リファレンス」を参照してください。
文字のエスケープ
円記号 (\
) は、正規表現エンジンによって解析されないように文字をエスケープするために使用されます。
次の文字が予約されています: []().\^$|?*+{}
。
入力文字列に一致させるために、パターンでこれらの文字をエスケープする必要があります。
# 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,}
注意
これにより、文字クラスで使用されている既存の円記号を含め、予約されているすべての正規表現文字がエスケープされます。 必ず、エスケープする必要があるパターンの部分でのみ使用してください。
その他の文字エスケープ
また、特殊文字の種類と一致させるために使用できる予約文字エスケープもあります。
一般的に使用される文字エスケープをいくつか次に示します。
文字エスケープ | 説明 |
---|---|
\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
キャプチャは、左から右に増加する数値 の整数 キーに格納されます。 キャプチャ 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
名前付きキャプチャ
既定では、キャプチャは左から右の昇順で格納されます。
キャプチャ グループに 名前 を割り当てることもできます。 この名前は、Hashtable 自動変数の$Matches
キーになります。
キャプチャ グループ内で を使用 ?<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 セキュリティ ログに最新のログ エントリを格納します。 指定された正規表現は、メッセージからユーザー名とドメインを抽出し、名前の場合は keys:N 、ドメインの 場合は D の下に格納します。
$log = (Get-WinEvent -LogName Security -MaxEvents 1).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....
詳細については、「 正規表現での構成体のグループ化」を参照してください。
正規表現での置換
演算子で -replace
正規表現を使用すると、キャプチャされたテキストを使用してテキストを動的に置き換えることができます。
<input> -replace <original>, <substitute>
<input>
: 検索する文字列<original>
: 入力文字列を検索するために使用される正規表現<substitute>
: 入力文字列内の一致を置き換える正規表現置換式。
注意
<original>
オペランドと <substitute>
オペランドは、文字エスケープなどの正規表現エンジンの規則に従います。
キャプチャ グループは、文字列内で <substitute>
参照できます。 置換は、グループ識別子の前に 文字を $
使用して行われます。
キャプチャ グループを参照するには、 Number と Name の 2 つの方法があります。
番号別 - キャプチャ グループには左から右に番号が付きます。
'John D. Smith' -replace '(\w+) (\w+)\. (\w+)', '$1.$2.$3@contoso.com'
John.D.Smith@contoso.com
名前で - キャプチャ グループは名前で参照することもできます。
'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
詳細については、「 正規表現での置換」を参照してください。