このサイトの詳細 |
はじめに |
正規表現クイックスタート |
正規表現チュートリアル |
置換文字列チュートリアル |
アプリケーションと言語 |
正規表現の例 |
正規表現リファレンス |
置換文字列リファレンス |
書籍レビュー |
印刷可能なPDF |
このサイトについて |
RSSフィードとブログ |
アンカー\Gは、前回のマッチが終了した位置でマッチします。最初のマッチ試行中は、\Gは、文字列の先頭で\Aと同様にマッチします。
\G\wを文字列test stringに適用すると、tにマッチします。 再度適用すると、eにマッチします。 3回目の試行ではsが得られ、4回目の試行では文字列の2番目のtにマッチします。 5回目の試行は失敗します。5回目の試行では、文字列の中でe\G\Gがマッチする唯一の場所は、2番目のet
前回のマッチの終了位置とマッチ試行の開始位置\G正規表現の種類やツールによっては、\Gは前回のマッチの終了位置ではなく、マッチ試行の開始位置でマッチします。これは、RubyとJust Great Softwareアプリケーションの場合です。EditPad Proでは、\G\G\Gはテキストカーソルの位置でマッチします。マッチが見つかると、EditPad Proはマッチを選択し、テキストカーソルをマッチの末尾に移動します。その結果、2回の検索の間にテキストカーソルを移動しない場合にのみ、\Gは前回のマッチ結果の末尾でマッチします。全体として、これはテキストエディタのコンテキストでは非常に理にかなっています。
前回のマッチの終了位置とマッチ試行の開始位置の区別は、正規表現が長さゼロのマッチを見つけることができる場合にも重要です。 ほとんどの正規表現エンジンは、長さゼロのマッチの後、文字列内を進みます。その場合、マッチ試行の開始位置は、前回のマッチ試行の終了位置よりも文字列内で1文字 आगेになります。 .NET、Java、およびBoostはこのように進み、\Gも前回のマッチ試行の終了位置でマッチします。したがって、\G\G\Gは、.NET、Java、およびBoostが長さゼロのマッチの後に進んだ場合、マッチに失敗します。
Perlでは、最後のマッチが終了した位置は、文字列変数ごとに個別に記憶される「魔法の」値です。 この位置は、どの正規表現にも関連付けられていません。つまり、\G\G
を使用して、別の正規表現が中断した場所から、対象文字列内の正規表現を継続させることができます。\Gマッチ試行が失敗した場合、\G.
の格納位置は文字列の先頭にリセットされます。これを回避するには、継続修飾子
while ($string =~ m/</g) {
if ($string =~ m/\GB>/c) {
# Bold
} elsif ($string =~ m/\GI>/c) {
# Italics
} else {
# ...etc...
}
}
/c
whileループ内の正規表現は、タグの開始ブラケットを検索し、ループ内の正規表現は、どのタグが見つかったかを確認します。 このようにして、ファイルに表示される順序でタグを解析できます。興味のあるすべてのタグに一致する1つの大きな正規表現を記述する必要はありません。\G他のプログラミング言語での\G\Gこの柔軟性は、他のほとんどのプログラミング言語では利用できません。たとえば、Javaでは、
の位置はMatcherオブジェクトによって記憶されます。 Matcherは、単一の正規表現と単一の対象文字列に厳密に関連付けられています。ただし、2番目のMatcherのマッチ試行を最初のMatcherのマッチが終了した場所から開始させるために、コード行を追加することはできます。そうすれば、\A\G\Aはこの位置でマッチします。\<マッチ試行の開始位置通常、\Aは文字列の先頭アンカーです。しかし、Tclでは、アンカー\`\A(バックスラッシュバックティック)は、文字列の先頭ではなく、マッチ試行の先頭でマッチします。GNUフレーバーでは、\<\\`
(バックスラッシュバックスラッシュバックティック)も同じことを行います。Tclで
regexp
を1回だけ呼び出す場合、またはGNUライブラリで
regexec()
を1回だけ呼び出す場合は、違いはありません。最初のマッチの後、文字列の残りの部分で別のマッチを見つけるために2回目の呼び出しを行うと、違いが生じる可能性があります。