クイックスタート
チュートリアル
ツールと言語
リファレンス
書籍レビュー
正規表現ツール
grep
PowerGREP
RegexBuddy
RegexMagic
汎用アプリケーション
EditPad Lite
EditPad Pro
言語とライブラリ
Boost
Delphi
GNU (Linux)
Groovy
Java
JavaScript
.NET
PCRE (C/C++)
PCRE2 (C/C++)
Perl
PHP
POSIX
PowerShell
Python
R
Ruby
std::regex
Tcl
VBScript
Visual Basic 6
wxWidgets
XML Schema
Xojo
XQueryとXPath
XRegExp
データベース
MySQL
Oracle
PostgreSQL
このサイトのその他の情報
はじめに
正規表現クイックスタート
正規表現チュートリアル
置換文字列チュートリアル
アプリケーションと言語
正規表現の例
正規表現リファレンス
置換文字列リファレンス
書籍レビュー
印刷可能なPDF
このサイトについて
RSSフィードとブログ
RegexBuddy—The best regex editor and tester for PowerShell developers!

PowerShellにおける正規表現

PowerShellは、主にシステム管理用に設計されたMicrosoftのプログラミング言語です。PowerShellは.NET上に構築されているため、.NETの優れた正規表現サポートもPowerShellプログラマが利用できます。

以下の説明は、Windows PowerShell 1.0から5.1、PowerShell Core 6、およびPowerShell 7に等しく適用されます。.NET 2.0以降、.NETまたは.NET Coreの正規表現構文に変更はありません。PowerShell 1.0は.NET 2.0の後にリリースされました。そのため、すべてのバージョンのPowerShellで同じ正規表現構文が使用されます。Windows PowerShell 2.0および5.0では、文字列の分割や他のRegex()コンストラクターの呼び出しを容易にするいくつかの機能が追加されました。それ以外に、正規表現の使用に関してPowerShellのバージョン間に違いはありません。

PowerShellの-Match演算子と-Replace演算子

-match演算子を使用すると、正規表現が文字列の一部と一致するかどうかをすばやく確認できます。例:'test' -match '\w'はtrueを返します。なぜなら\wttest.

の中で一致するからです。副作用として、この-match演算子は$matchesと呼ばれる特殊な変数を設定します。これは、正規表現全体の一致とすべてのキャプチャグループの一致を保持する連想配列です。$matches[0]は正規表現全体の一致を、$matches[1]は最初のキャプチャグループの一致を、そして$matches['name']は名前付きグループ「name」によって一致したテキストを提供します。

-replace演算子は、正規表現を使用して文字列の検索と置換を行います。例:'test' -replace '\w', '$&$&''tteesstt'を返します。正規表現は1文字に一致します。置換テキストは、を使用して正規表現の一致を2回再挿入します。置換テキストパラメータを指定する必要があり、正規表現と置換はコンマで区切る必要があります。正規表現の一致を何も置換したくない場合は、空の文字列を置換として渡します。\w従来、正規表現は大文字と小文字が区別されます。これは.NETフレームワークにも当てはまります。ただし、PowerShellではそうではありません。$&

-match-match-replace-replaceは大文字と小文字を区別しません。-imatch-ireplaceも同様です。大文字と小文字を区別する一致には、-cmatch

-creplaceを使用します。大文字と小文字の区別に関する混乱を避けるため、常に「i」または「c」プレフィックスを使用することをお勧めします。これらの演算子は、.NETのRegexOptions列挙体からオプションを渡す方法を提供していません。代わりに、正規表現でモード修飾子を使用します。例:(?m)^test$は、RegexOptions.MultiLineをRegex()コンストラクターに渡して^test$を使用するのと同じです。モード修飾子は、正規表現の外部で設定されたオプションよりも優先されます。-cmatch '(?i)test'-matchは大文字と小文字を区別しませんが、

-imatch '(?-i)test'

は大文字と小文字を区別します。モード修飾子は、-imatch演算子の大文字と小文字を区別しない設定をオーバーライドします。PowerShellの-Split演算子Windows 7 SP1で導入されたPowerShell 2.0では、

-split

-replace演算子が追加されました。これにより、正規表現の一致に沿って文字列を分割できます。例:$&$subject -split "\W+"$1は、対象の文字列を単語以外の文字に沿って分割し、文字列内のすべての単語の配列を返します。リテラル文字列としての置換テキスト-replace

演算子は、.NETのRegex.Replace()関数と同じ置換テキストプレースホルダーをサポートします。-replace$&$1は正規表現全体の一致、-replace$1$matchesは最初のキャプチャグループによって一致したテキスト、そして${name}は名前付きグループ「name」によって一致したテキストです。ただし、PowerShellには追加の注意点があります。二重引用符で囲まれた文字列は、変数展開にドル記号構文を使用します。変数展開は、Regex.Replace()関数($2$1-replaceが内部的に使用する)が置換テキストを解析する前に行われます。Perlとは異なり、$1はPowerShellの魔法の変数ではありません。その構文は置換テキストでのみ機能します。-replace$2$1演算子は

$1

変数を設定しません。その結果、'test' -replace '(\w)(\w)', "$2$1"(二重引用符で囲まれた置換)は空の文字列を返します(前のPowerShellコードで変数$ 1と$ 2を設定しなかったと仮定)。変数展開のため、Replace()関数は$2$1を認識しません。Replace()関数がプレースホルダーを置換できるようにするには、'test' -replace '(\w)(\w)', '$2$1'(一重引用符で囲まれた置換)または'test' -replace '(\w)(\w)', '$2$1''test' -replace '(\w)(\w)', "`$2`$1"

(ドル記号をバックティックでエスケープ)を使用して、

using namespace System.Text.RegularExpressions
$regex = [Regex]::new('^test$', [RegexOptions]::MultiLine)

$2$1がRegex.Replace()に文字通り渡されるようにします。System.Text.RegularExpressions.Regexクラスの使用

$regex = new-object System.Text.RegularExpressions.Regex ('^test$',
         [System.Text.RegularExpressions.RegexOptions]::MultiLine)

PowerShellで.NETのすべての正規表現処理機能を使用するには、System.Text.RegularExpressions.Regexクラスをインスタンス化して正規表現オブジェクトを作成します。PowerShellは、正規表現を含む文字列を唯一のパラメーターとして取るRegex()コンストラクターを使用する場合に便利なショートカットを提供します。

$regex = [regex] '(?m)^test$'

$regex = [regex] '\W+'-match, -replaceは正規表現-imatch\W+

| クイックスタート | チュートリアル | ツールと言語 |  | リファレンス | 書籍レビュー |

| grep | PowerGREP | RegexBuddy | RegexMagic |

| EditPad Lite | EditPad Pro |

| Boost | Delphi | GNU (Linux) | Groovy | Java | JavaScript | .NET | PCRE (C/C++) | PCRE2 (C/C++) | Perl | PHP | POSIX | PowerShell | Python | R | Ruby | std::regex | Tcl | VBScript | Visual Basic 6 | wxWidgets | XML Schema | Xojo | XQuery & XPath | XRegExp |

| MySQL | Oracle | PostgreSQL |