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

前回のマッチの末尾から継続する

アンカー\Gは、前回のマッチが終了した位置でマッチします。最初のマッチ試行中は、\Gは、文字列の先頭\Aと同様にマッチします。

\G\wを文字列test stringに適用すると、tにマッチします。 再度適用すると、eにマッチします。 3回目の試行ではsが得られ、4回目の試行では文字列の2番目のtにマッチします。 5回目の試行は失敗します。5回目の試行では、文字列の中でe\G\Gがマッチする唯一の場所は、2番目のet

の後です。しかし、その位置の後には単語文字が続かないため、マッチは失敗します。

前回のマッチの終了位置とマッチ試行の開始位置\G正規表現の種類やツールによっては、\Gは前回のマッチの終了位置ではなく、マッチ試行の開始位置でマッチします。これは、RubyJust Great Softwareアプリケーションの場合です。EditPad Proでは、\G\G\Gはテキストカーソルの位置でマッチします。マッチが見つかると、EditPad Proはマッチを選択し、テキストカーソルをマッチの末尾に移動します。その結果、2回の検索の間にテキストカーソルを移動しない場合にのみ、\Gは前回のマッチ結果の末尾でマッチします。全体として、これはテキストエディタのコンテキストでは非常に理にかなっています。

前回のマッチの終了位置とマッチ試行の開始位置の区別は、正規表現が長さゼロのマッチを見つけることができる場合にも重要です。 ほとんどの正規表現エンジンは、長さゼロのマッチの後、文字列内を進みます。その場合、マッチ試行の開始位置は、前回のマッチ試行の終了位置よりも文字列内で1文字 आगेになります。 .NETJava、およびBoostはこのように進み、\Gも前回のマッチ試行の終了位置でマッチします。したがって、\G\G\Gは、.NET、Java、およびBoostが長さゼロのマッチの後に進んだ場合、マッチに失敗します。

Perlでの\Gマジック

Perlでは、最後のマッチが終了した位置は、文字列変数ごとに個別に記憶される「魔法の」値です。 この位置は、どの正規表現にも関連付けられていません。つまり、\G\G

を使用して、別の正規表現が中断した場所から、対象文字列内の正規表現を継続させることができます。\Gマッチ試行が失敗した場合、\G.

の格納位置は文字列の先頭にリセットされます。これを回避するには、継続修飾子

while ($string =~ m/</g) {
  if ($string =~ m/\GB>/c) {
    # Bold
  } elsif ($string =~ m/\GI>/c) {
    # Italics
  } else {
    # ...etc...
  }
}

/c

を指定します。これは、複数の正規表現を連携させるのに非常に役立ちます。たとえば、次のようにHTMLファイルを解析できます。

whileループ内の正規表現は、タグの開始ブラケットを検索し、ループ内の正規表現は、どのタグが見つかったかを確認します。 このようにして、ファイルに表示される順序でタグを解析できます。興味のあるすべてのタグに一致する1つの大きな正規表現を記述する必要はありません。\G他のプログラミング言語での\G\Gこの柔軟性は、他のほとんどのプログラミング言語では利用できません。たとえば、Javaでは、

\G

の位置はMatcherオブジェクトによって記憶されます。 Matcherは、単一の正規表現と単一の対象文字列に厳密に関連付けられています。ただし、2番目のMatcherのマッチ試行を最初のMatcherのマッチが終了した場所から開始させるために、コード行を追加することはできます。そうすれば、\A\G\Aはこの位置でマッチします。\<マッチ試行の開始位置通常、\A文字列の先頭アンカーです。しかし、Tclでは、アンカー\`\A(バックスラッシュバックティック)は、文字列の先頭ではなく、マッチ試行の先頭でマッチします。GNUフレーバーでは、\<\\`

(バックスラッシュバックスラッシュバックティック)も同じことを行います。Tclで

regexp