クイック スタート
チュートリアル
ツール & 言語
リファレンス
ブック レビュー
正規表現チュートリアル
はじめに
目次
特殊文字
非印刷可能文字
正規表現エンジンの内部
文字クラス
文字クラスの減算
文字クラスの共通部分
短縮表記文字クラス
ドット
アンカー
単語境界
選択
省略可能な項目
繰り返し
グループ化&キャプチャ
後方参照
後方参照、パート2
名前付きグループ
相対後方参照
分岐リセットグループ
フリースペース&コメント
Unicode
モード修飾子
アトミックグループ
所有量限定子
先行一致&先行不一致
先行一致、パート2
一致からテキストを除外
条件式
バランスグループ
再帰
サブルーチン
無限再帰
再帰&限定子
再帰&キャプチャ
再帰&後方参照
再帰&バックトラック
POSIXブラケット表現
ゼロ長さ一致
一致の継続
このサイトの詳細
はじめに
正規表現のクイックスタート
正規表現チュートリアル
置換文字列のチュートリアル
アプリケーションと言語
正規表現の例
正規表現リファレンス
置換文字列リファレンス
ブックレビュー
PDFで印刷
このサイトについて
RSSフィード&ブログ
RegexBuddy—Better than a regular expression tutorial!

単語境界

メタ文字\bは、キャレット記号やドル記号のようなアンカーです。「単語境界」と呼ばれる位置に一致します。この一致はゼロ長です。

単語境界として適格になる3つの位置があります

簡単に言えば\bを使用して、\b単語\bの形で正規表現を使用して「単語のみ」の検索を実行できます。 「単語文字」とは、単語の形成に使用できる文字です。「単語文字」ではないすべての文字は「非単語文字」です。

どの文字が単語文字であるかは、使用している正規表現の種類によって異なります。ほとんどの種類では、ショートハンド文字クラスによって一致する文字\wが、単語境界によって単語文字として扱われる文字です。Javaは例外です。Javaは\bに対してはUnicodeをサポートしていますが、\w.

に対してはサポートしていません

以下で説明するものを除くほとんどのフレーバーには、単語の前と単語の後に一致するメタ文字が1つしかありません。これは、文字間のいずれの位置も単語の最初と最後にはならない可能性があるためです。1つの演算子のみを使用すると、作業が容易になります。\b4\b4 が大きい数字の一部ではない場合にマッチするために使用できます。この正規表現では、A4 用紙 44 枚にはマッチしません。つまり、「英数字列の前後でマッチする」と言うよりも、「単語の前後でマッチする」と言う方がより正確です。\b\B

の否定バージョンであり、\b. がマッチするすべての位置でマッチせず、\b効果的に、2 つの単語文字の間の任意の位置だけでなく、2 つの非単語文字の間の任意の位置でマッチします。

正規表現エンジンの内部を調べる

正規表現\bis\bを文字列This island is beautifulに適用するとどうなるかを見てみましょう。エンジンは、最初のトークン\bから、最初の文字Tで開始します。このトークンは長さがゼロなので、文字より前の位置が検査されます。\bここでマッチします。なぜなら、T は単語文字で、その前の文字は文字列の開始前のヌルだからです。エンジンは次のトークン、リテラルiに進みます。エンジンは文字列の次の文字に進みません。なぜなら、前の正規表現トークンは長さがゼロだったからです。iにはマッチしないTので、エンジンは最初のトークンを次の文字位置で再試行します。

\bTとの間の位置ではマッチできません。hの間でもマッチできず、hとの間の位置ではマッチできません。iとの間でもマッチできません。iとの間の位置ではマッチできません。s.

文字列の次の文字は空白です。\bここでマッチします。なぜなら、空白は単語文字ではなく、前の文字が単語文字だからです。繰り返しになりますが、エンジンはiに進みますが、これは空白ではマッチしません。

文字を進めて最初の正規表現トークンから再起動すると、\bは空白と文字列内の 2 番目のiの間でマッチします。継続して、正規表現エンジンはiissにマッチすることを検出します。現在、エンジンは 2 番目の\blより前の位置でマッチしようとします。この位置は 2 つの単語文字の間に位置するため、失敗します。エンジンは正規表現の開始に戻って 1 文字進めてsinisland\bに移動します。繰り返しになりますが、iはマッチせず、2 番目の空白に到達するまでマッチしません。そこでマッチしますが、

のマッチは失敗します。\bただし、iは文字列内の 3 番目のiissより前の位置でマッチします。エンジンは続け、\bを発見します。正規表現内の最後のトークンである

も、空白は単語文字ではなく、その前の文字が単語文字なので、文字列内の 3 番目の空白より前の位置でマッチします。エンジンは、単語isエンジンは、単語を文字列内で正常にマッチさせ、i と s の前の 2 つの出現をスキップします。正規表現エンジンは、単語inを使用した場合、.

This

Tcl の単語境界

上記で説明した単語境界は、ほとんどの正規表現でサポートされています。注目すべき例外は POSIXXML スキーマ フレーバーで、単語境界をまったくサポートしていません。Tcl は異なる構文を使用します。\bTcl では、は、ほとんどの正規表現フレーバー (Tcl を含む)\x08と同じく、バックスペース文字とマッチします。\\は、Tcl で単一のバックスラッシュ文字とマッチし、他のすべての正規表現フレーバー (Tcl も含む)

Tcl は文字「y」を文字「b」の代わりに使用し、単語の境界に一致します。\yは任意の単語境界位置と一致しますが、\Yは単語境界ではない任意の位置と一致します。これらの Tcl 正規表現トークンは、Perl スタイルの正規表現フレーバーとまったく同じように一致します。これらは、単語の開始と終了を区別しません。\bTcl には、単語の開始と終了を区別するさらに 2 つの単語境界トークンがあります。

\mは単語の開始でのみ一致します。つまり、左側に非単語文字があり、右側に単語文字がある任意の位置と一致します。また、文字列の先頭文字が単語文字の場合、文字列の先頭でも一致します。\Mは単語の終了でのみ一致します。つまり、左側に単語文字があり、右側に非単語文字がある任意の位置と一致します。また、文字列の最後の文字が単語文字の場合、文字列の最後でも一致します。Tcl スタイルの単語境界をサポートする唯一の正規表現エンジン(Tcl 自体以外)は、JGsoft エンジンです。 PowerGREPおよび EditPad Proでは、

は Perl スタイルの単語境界であり、\bは Tcl スタイルの単語境界です。\y, \Y, は単語の開始でのみ一致します。つまり、左側に非単語文字があり、右側に単語文字がある任意の位置と一致します。また、文字列の先頭文字が単語文字の場合、文字列の先頭でも一致します。は単語の終了でのみ一致します。つまり、左側に単語文字があり、右側に非単語文字がある任意の位置と一致します。また、文字列の最後の文字が単語文字の場合、文字列の最後でも一致します。ほとんどの場合、

トークンがないことは問題になりません。は単語の開始でのみ一致します。つまり、左側に非単語文字があり、右側に単語文字がある任意の位置と一致します。また、文字列の先頭文字が単語文字の場合、文字列の先頭でも一致します。は単語の終了でのみ一致します。つまり、左側に単語文字があり、右側に非単語文字がある任意の位置と一致します。また、文字列の最後の文字が単語文字の場合、文字列の最後でも一致します。\y単語\yは「単語」の「単独の単語のみ」の出現を次のように見つけます。\m単語\Mと同様です。\M単語\mは決してどこにも一致しません。は単語文字の後に続く位置では決して一致せず、は単語の終了でのみ一致します。つまり、左側に単語文字があり、右側に非単語文字がある任意の位置と一致します。また、文字列の最後の文字が単語文字の場合、文字列の最後でも一致します。は単語文字の前にある位置では決して一致しないからです。は単語の開始でのみ一致します。つまり、左側に非単語文字があり、右側に単語文字がある任意の位置と一致します。また、文字列の先頭文字が単語文字の場合、文字列の先頭でも一致します。の正規表現で\yの前後にある文字と一致させる必要がある場合は、正規表現内でこれらの文字が単語文字であるべきか否か、非単語文字であるべきかを簡単に指定できます。\y\w+\y\m.+\Mと同じ結果になります。

\wをドットの代わりに使用すると、最初の\yは自動的に単語の開始に制限され、2 番目の\yは単語の終了に制限されます。\y.+\yは機能しないことに注意してください。この正規表現は各単語と、サブジェクト文字列内の単語間に存在する非単語文字のシーケンスにも一致します。ただし、フレーバーがは単語の開始でのみ一致します。つまり、左側に非単語文字があり、右側に単語文字がある任意の位置と一致します。また、文字列の先頭文字が単語文字の場合、文字列の先頭でも一致します。は単語の終了でのみ一致します。つまり、左側に単語文字があり、右側に非単語文字がある任意の位置と一致します。また、文字列の最後の文字が単語文字の場合、文字列の最後でも一致します。をサポートする場合、正規表現エンジンは\m\w+\M\y\w+\yよりも少し高速に処理できる可能性があります。これは、内部最適化によって異なります。

正規表現フレーバーが 先行参照と先行否定参照 をサポートしている場合は、(?<!\w)(?=\w)で Tcl のは単語の開始でのみ一致します。つまり、左側に非単語文字があり、右側に単語文字がある任意の位置と一致します。また、文字列の先頭文字が単語文字の場合、文字列の先頭でも一致します。(?<=\w)(?!\w)でエミュレートできます。は単語の終了でのみ一致します。つまり、左側に単語文字があり、右側に非単語文字がある任意の位置と一致します。また、文字列の最後の文字が単語文字の場合、文字列の最後でも一致します。かなり冗長ですが、この後方参照構造はTclの単語境界とまったく同じように一致します。

フレーバーに先行参照は付いていても後方参照はなく、さらにPerlスタイルの単語境界がある場合は、次を使用できます。\b(?=\w)で Tcl のは単語の開始でのみ一致します。つまり、左側に非単語文字があり、右側に単語文字がある任意の位置と一致します。また、文字列の先頭文字が単語文字の場合、文字列の先頭でも一致します。\b(?!\w)でエミュレートできます。は単語の終了でのみ一致します。つまり、左側に単語文字があり、右側に非単語文字がある任意の位置と一致します。また、文字列の最後の文字が単語文字の場合、文字列の最後でも一致します。. \b単語の最初か最後と一致します。先行参照は、次の文字が単語の一部かどうかを確認します。そうであれば、単語の最初となります。それ以外の場合は、単語の最後となります。

GNU単語境界

GNU拡張のPOSIX正規表現には、\b上記で説明した単語境界に対するサポートが追加されました。GNUでは、単語の先頭と単語の末尾の境界にも独自の構文を使用します。\<Tclのは単語の開始でのみ一致します。つまり、左側に非単語文字があり、右側に単語文字がある任意の位置と一致します。また、文字列の先頭文字が単語文字の場合、文字列の先頭でも一致します。. \>Tclのは単語の終了でのみ一致します。つまり、左側に単語文字があり、右側に非単語文字がある任意の位置と一致します。また、文字列の最後の文字が単語文字の場合、文字列の最後でも一致します。.

Boostでも\<\>ECMAScript、拡張、egrep、awk文法を使用するときに単語境界として扱われます。

POSIX単語境界

POSIX標準では[[:<:]]が単語境界の始まりとして定義され、[[:>:]]が単語境界の終わりとして定義されています。構文はPOSIX括弧式から借用されていますが、これらのトークンは、と何の関係もなく文字クラスの内部では使用できない単語境界です。TclとGNUでもPOSIX単語境界がサポートされています。PCREでは、バージョン8.34以降でPOSIX単語境界がサポートされています。Boostでは、すべての文法でサポートされています。