正規表現 - 構文


正規表現 (正規表現) は、文字列に特定の部分文字列が含まれているかどうかを確認したり、一致した部分文字列を置換したり、特定の条件を満たす文字列から部分文字列を抽出したりするために使用できる、文字列の一致パターンを記述します。

  • ディレクトリをリストする場合、dir *.txt または ls *.txt 内の *.txt は正規表現ではありません。これは、ここでの * の意味が正規表現の * とは異なるためです。

  • 正規表現の構築は、数式の作成と同じです。つまり、さまざまなメタキャラクタや演算子を使用して、小さな式を組み合わせて、より大きな式を作成できます。正規表現のコンポーネントは、単一の文字、文字のコレクション、文字の範囲、文字間の選択、またはこれらすべてのコンポーネントの任意の組み合わせにすることができます。

正規表現は、通常の文字 (a から z までの文字など) と特殊文字 (「メタキャラクター」と呼ばれる) で構成されるテキスト パターンです。パターンは、テキストを検索するときに一致する 1 つ以上の文字列を記述します。正規表現は、文字パターンと検索文字列を照合するテンプレートとして機能します。

通常の文字

通常の文字には、メタキャラクターとして明示的に指定されていないすべての印刷可能文字と印刷不可能な文字が含まれます。これには、すべての大文字と小文字、すべての数字、すべての句読点、およびその他の記号が含まれます。

非印刷文字

非印刷文字も正規表現の一部にすることができます。次の表に、非印刷文字を表すエスケープ シーケンスを示します。

文字 説明
cx は、x で指定された制御文字と一致します。たとえば、cM は Control-M または復帰文字と一致します。 x の値は、A ~ Z または a ~ z のいずれかでなければなりません。それ以外の場合、c はリテラルの「c」文字として扱われます。
f はフォーム フィードと一致します。 x0c および cL に相当します。
nは改行文字と一致します。 x0a および cJ に相当します。
r は復帰文字と一致します。 x0d および cM に相当します。
s は、スペース、タブ、フォーム フィードなどを含む任意の空白文字と一致します。 【fnrtv】に相当。
S は、空白以外の文字と一致します。 [^ fnrtv] に相当します。
tはタブ文字と一致します。 x09 および cI に相当します。
v は垂直タブ文字と一致します。 x0b および cK に相当します。

特殊文字

いわゆる特殊文字は、特別な意味を持つ文字です。たとえば、上記の「*.txt」の * は、単に任意の文字列の意味を意味します。ファイル名に * が含まれるファイルを検索する場合は、* をエスケープする、つまり * の前に 1 を追加する必要があります。 ls*.txt。

多くのメタキャラクターは、それらを照合するときに特別な処理が必要です。これらの特殊文字と一致させるには、まず文字を「エスケープ」する必要があります。つまり、文字の前にバックスラッシュ文字 () を付けます。次の表に、正規表現の特殊文字を示します。

特殊文字 説明
$ 入力文字列の終了位置と一致します。 RegExp オブジェクトの Multiline プロパティが設定されている場合、$ は 'n' または 'r' にも一致します。 $ 文字そのものと一致させるには、$ を使用します。
( ) は部分式の開始と終了をマークします。部分式は後で使用するために取得できます。これらの文字と一致させるには、( と ) を使用します。
* 直前の部分式と 0 回以上一致します。 * 文字と一致させるには、* を使用します。
+ は、前の部分式と 1 回以上一致します。 + 文字と一致させるには、+ を使用します。
. は、改行文字 n を除く任意の 1 文字と一致します。 . と一致させるには、 を使用します。
[は角括弧式の始まりを示します。 [ と一致させるには、[ を使用します。
? 先行する部分式と 0 回または 1 回一致するか、非貪​​欲修飾子を指定します。 ? 文字に一致させるには、? を使用します。
次の文字を特殊文字、リテラル文字、後方参照、または 8 進エスケープ文字のいずれかとしてマークします。たとえば、「n」は文字「n」と一致します。 「n」は改行文字に一致します。シーケンス '\' は "" に一致し、'(' は "(" に一致します。
^ は、角括弧式で使用されない限り、入力文字列の先頭に一致します。この場合、文字が受け入れられません。コレクション。^ 文字そのものと一致するには、
{ を使用して修飾子式の先頭をマークします。 | と一致させるには、
を使用します。

修飾子

修飾子は、一致を満たすために正規表現の特定のコンポーネントが何回出現する必要があるかを指定するために使用されます。 * または + または ? または {n} または {n,} または {n,m} の 6 種類があります。

正規表現の修飾子は次のとおりです:

Character Description
* 直前の部分式と 0 回以上一致します。たとえば、zo* は「z」と「zoo」に一致します。 * {0,} に相当します。
+ は、前の部分式と 1 回以上一致します。たとえば、「zo+」は「zo」と「zoo」には一致しますが、「z」には一致しません。 + は {1,} と同等です。
? 直前の部分式と 0 回または 1 回一致します。たとえば、「do(es)?」は「do」または「does」の「do」と一致します。 ? {0,1} に相当します。
{n}n は負ではない整数です。特定の回数 n 回一致します。たとえば、「o{2}」は「Bob」の「o」とは一致しませんが、「food」の両方の「o」には一致します。
{n,}n は負ではない整数です。少なくとも n 回一致します。たとえば、「o{2,}」は「Bob」の「o」とは一致しませんが、「foooood」のすべての「o」と一致します。 「o{1,}」は「o+」と同等です。 「o{0,}」は「o*」と同等です。
{n,m}m と n は両方とも非負の整数であり、n <= m です。少なくとも n 回、最大で m 回一致します。たとえば、「o{1,3}」は「fooooood」の最初の 3 つの o と一致します。 「o{0,1}」は「o?」と同等です。カンマと 2 つの数字の間にスペースを入れることはできないことに注意してください。

大きな入力ドキュメントでは章番号が 9 を超える可能性があるため、2 桁または 3 桁の章番号を処理する方法が必要です。修飾子はこの能力を与えます。次の正規表現は、任意の桁数で番号付けされた章タイトルに一致します:

/Chapter [1-9][0-9]*/

範囲式の後に修飾子が表示されることに注意してください。したがって、これは範囲式全体に適用されます。この場合、0 ~ 9 (両端の値を含む) の数値のみが指定されます。

2 番目以降の位置に必ずしも数字を入れる必要がないため、ここでは + 修飾子は使用されません。それも使わないの?章番号が 2 桁に制限されているためです。章の後に少なくとも 1 つの数字とスペース文字が一致する必要があります。

章番号が 99 章のみに制限されていることがわかっている場合は、以下の式を使用して少なくとも 1 桁、最大 2 桁を指定できます。

/Chapter [0-9]{1,2}/

上記の式の欠点は、99 を超える章番号が最初の 2 桁にしか一致しないことです。もう一つの欠点は、Chapter 0 も一致することです。 2 桁のみに一致するより良い表現は、

/Chapter [1-9][0-9]?/

または

/Chapter [1-9][0-9]{0,1}/

* です。 + および ? 修飾子は、後に A ? が続く場合にのみ、可能な限り多くのリテラルと一致します。貪欲または最小限のマッチング。

たとえば、HTML ドキュメント内で H1 タグで囲まれた章のタイトルを検索するとします。そのテキストは文書内では次のようになります:

<H1>Chapter 1 – Introduction to Regular Expressions</H1>

以下の式は、開始の小なり記号 (<) から終了 H1 タグの大なり記号 (>) までのすべてに一致します。

/<.*>/

開始 H1 タグのみを一致させる必要がある場合、以下の「非貪欲」式は <H1> のみに一致します。

/<.*?>/

*、+、または ? 修飾子の後に ? を置くと、式は「貪欲な」式から「非貪欲な」式または最小一致に変換されます。

ロケーター

ロケーターを使用すると、行の先頭または末尾に正規表現を固定できます。また、単語内、単語の先頭、または単語の末尾に表示される正規表現を作成することもできます。

ロケーターは文字列または単語の境界を表すために使用され、^ と $ はそれぞれ文字列の先頭と末尾を指し、b は単語の前または後ろの境界を表し、B は単語以外の境界を表します。 。

正規表現の修飾子は次のとおりです:

Character Description
^は入力文字列の先頭と一致します。 RegExp オブジェクトの Multiline プロパティが設定されている場合、^ は n または r の後の位置にも一致します。
$は、入力文字列の末尾と一致します。 RegExp オブジェクトの Multiline プロパティが設定されている場合、$ は n または r の前の位置にも一致します。
b は、単語の境界、つまり単語とスペースの間の位置に一致します。
B非単語境界のマッチング。

: アンカー ポイントで修飾子を使用することはできません。改行または単語境界の直前または直後に複数の位置を置くことはできないため、^* などの表現は許可されません。

テキスト行の先頭のテキストを照合するには、正規表現の先頭に ^ 文字を使用します。この ^ の使用と括弧内の式の使用を混同しないでください。

テキスト行の末尾のテキストと一致するには、正規表現の末尾に $ 文字を使用します。

章タイトルを検索するときにアンカー ポイントを使用するには、次の正規表現は、末尾 2 桁のみを含み、行の先頭に表示される章タイトルと一致します。

/^Chapter [1-9][0-9]{0,1}/

実際の章タイトルは、行の先頭にのみ表示されます。 line 、これがその行上の唯一のテキストです。これは、行の先頭と同じ行の末尾の両方に表示されます。次の式は、指定された一致が相互参照ではなく章のみに一致することを保証します。これを行うには、テキスト行の先頭と末尾のみに一致する正規表現を作成します。

/^Chapter [1-9][0-9]{0,1}$/

単語境界のマッチングは少し異なりますが、正規表現に重要な機能が追加されます。単語の境界は、単語とスペースの間の位置です。非単語境界は、その他の位置です。次の式は、Chapter という単語の最初の 3 文字と一致します。これらの 3 文字は単語境界の後に出現するためです。

/\bCha/

b 文字の位置は非常に重要です。単語の先頭が一致する文字列の先頭にある場合は、その単語の先頭で一致するものを探します。それが文字列の末尾にある場合は、単語の末尾で一致するものを探します。たとえば、次の式は単語境界の前に出現するため、単語 Chapter の文字列 ter と一致します。

/ter\b/

次の式は、Chapter の文字列 apt と一致しますが、aptitude の文字列 apt とは一致しません:

/\Bapt/

文字列 apt は発生しますChapter という単語では単語以外の境界にありますが、aptitude という単語では単語境界にあります。 B 非単語境界演算子の場合、単語の先頭か末尾が一致するかどうかは関係ないため、位置は重要ではありません。

選択

すべての選択項目をかっこで囲み、隣接する選択項目を | で区切ります。ただし、括弧を使用すると、関連する一致がキャッシュされるという副作用が生じます。この場合、最初のオプションの前に ?: を使用すると、この副作用を排除できます。

そのうちの ?: は非キャプチャ要素の 1 つで、他の 2 つの非キャプチャ要素は ?= と ?! です。これら 2 つはより多くの意味を持ち、前者は括弧内にあるものと一致します。正規表現パターンは、正規表現パターンに一致しない任意の位置の検索文字列に一致します。後者は、正規表現パターンに一致しない任意の最初の位置にある検索文字列に一致します。

後方参照

正規表現パターンまたはパターンの一部をかっこで囲むと、関連付けられた一致が一時バッファーに保存され、キャプチャされた各部分一致が正規表現パターン内で左から右に並べられ、出現順に保存されます。バッファ番号は 1 から始まり、最大 99 個のキャプチャされた部分式を保存できます。各バッファには、「n」を使用してアクセスできます。n は、特定のバッファを識別する 1 桁または 2 桁の 10 進数です。

キャプチャは、関連付けられた一致の保存を無視して、非キャプチャ メタキャラクタ「?:」、「?=」、または「?!」を使用してオーバーライドできます。

後方参照の最も単純で最も便利なアプリケーションの 1 つは、テキスト内で隣接する 2 つの同一の単語の一致を見つける機能です。次の文を例に挙げます。

Is is the cost of of gasoline going up up?

上の文には明らかに複数の単語が繰り返されています。各単語の繰り返しを探すことなく、この文を見つける方法を工夫するとよいでしょう。次の正規表現は、単一の部分式を使用してこれを実現します。

/\b([a-z]+) \b/gi

[a-z]+ で指定された、1 つ以上の文字を含む式をキャプチャします。正規表現の 2 番目の部分は、以前に取得された部分一致への参照、つまり、括弧表現と完全に一致する単語の 2 番目の出現です。 1 は最初のサブマッチを指定します。単語境界メタキャラクターにより、単語全体のみが確実に検出されます。そうしないと、「発行されました」や「これは」などの語句がこの式で正しく認識されません。

正規表現の後のグローバル タグ (g) は、入力文字列内で見つかったすべての一致にその式が適用されることを示します。式の末尾にある case-insensitive (i) タグは、大文字と小文字を区別しないことを指定します。複数行タグは、改行文字のどちらかの側で発生する可能性のある一致を指定します。

後方参照は、Universal Resource Indicator (URI) をそのコンポーネントに分割することもできます。次の URI をプロトコル (ftp、http など)、ドメイン アドレス、ページ/パスに分解するとします。

http://www.w3cschool.cc:80/html/html-tutorial.html

次の正規表現は、この機能を提供します。

/(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/

最初の括弧部分式は、Web アドレス部分をキャプチャします。合意書。この部分式は、コロンと 2 つのスラッシュが前にある任意の単語と一致します。 2 番目の括弧部分式は、アドレスのドメイン アドレス部分を取得します。部分式は、/ と : を除く 1 つ以上の文字と一致します。 3 番目の括弧内の部分式は、ポート番号 (指定されている場合) を取得します。この部分式は、コロンに続く 0 個以上の数字と一致します。この部分式は 1 回だけ繰り返すことができます。最後に、4 番目の括弧部分式は、Web アドレスで指定されたパスおよび/またはページ情報を取得します。この部分式は、# またはスペース文字を含まない任意の文字シーケンスと一致します。

上記の URI に正規表現を適用すると、各部分一致には以下が含まれます:

  • 最初の括弧で囲まれた部分表現には「http」が含まれます

  • 2 番目の括弧で囲まれた部分表現には「www .w3cschool.cc」が含まれます

  • 3 番目の括弧の部分式には「:80」が含まれます

  • 4 番目の括弧の部分式には「../html/html-tutorial.html」が含まれます