このサイトの詳細 |
はじめに |
正規表現クイックスタート |
正規表現チュートリアル |
置換文字列チュートリアル |
アプリケーションと言語 |
正規表現の例 |
正規表現リファレンス |
置換文字列リファレンス |
書籍レビュー |
印刷可能なPDF |
このサイトについて |
RSSフィードとブログ |
アトミックグループとは、正規表現エンジンがグループから抜けるときに、グループ内のトークンによって記憶されているすべてのバックトラッキング位置を自動的に破棄するグループです。アトミックグループはキャプチャしません。構文は次のとおりです。(?>グループ)。先読み/後読みグループもアトミックです。アトミックグループは、JGsoftフレーバー、Java、PCRE、.NET、Perl、Boost、Rubyなど、最新の正規表現フレーバーのほとんどでサポートされています。これらのほとんどは、所有量指定子もサポートしており、これは基本的にアトミックグループの表記上の便宜です。Pythonは、Pythonバージョン3.11以降でアトミックグループと所有量指定子をサポートしています。
例を挙げると、アトミックグループの動作が明確になります。正規表現a(bc|b)c(キャプチャグループ)は、abccとabcに一致します。正規表現a(?>bc|b)c(アトミックグループ)は、abccに一致しますが、abcには一致しません。abccabccabc.
abcabcabccaがa, bcがbcに一致し、その後、cは文字列の末尾で一致に失敗します。ここで、それらのパスは分岐します。キャプチャグループを持つ正規表現は、選択のバックトラッキング位置を記憶しています。グループは一致を放棄し、bがbとcbcに一致し、
cbcがbccに一致しま す。一致が見つかりました!
ただし、アトミックグループを持つ正規表現は、bcが一致した後にアトミックグループから抜けました。その時点で、グループ内のトークンのすべてのバックトラッキング位置は破棄されます。この例では、文字列の2番目の位置でbを試すという選択肢は破棄されます。その結果、cが失敗すると、正規表現エンジンには試す選択肢がなくなります。
アトミックグループを使用した正規表現の最適化正規表現\b(integer|insert|in)\bと対象文字列integers
を考えてみましょう。単語境界のため、これらは明らかに一致しません。それほど明白ではないのは、正規表現エンジンがこれを理解するためにかなりの労力を費やすことです。\bは文字列の先頭で一致し、integerはintegersの先頭の6文字と一致します。正規表現エンジンは、グループ内にさらに2つの選択肢があることに注意し、\bで続行します。これは、rとsの間では一致に失敗します。そのため、エンジンはバックトラックして、グループ内の2番目の選択肢を試します。2番目の選択肢はinsertの先頭の2文字であるinと一致しますが、その後、\bとの一致に失敗します。そのため、エンジンはもう一度バックトラックして、3番目の選択肢を試します。 \bは今回はnとtの間で失敗します。正規表現エンジンには記憶されているバックトラッキング位置がなくなったため、失敗を宣言します。bは文字列の先頭で一致し、integerはintegersの先頭の6文字と一致します。正規表現エンジンは、グループ内にさらに2つの選択肢があることに注意し、\bで続行します。これは、rとsの間では一致に失敗します。そのため、エンジンはバックトラックして、グループ内の2番目の選択肢を試します。2番目の選択肢はinsertの先頭の2文字であるinと一致しますが、その後、\bとの一致に失敗します。そのため、エンジンはもう一度バックトラックして、3番目の選択肢を試します。 \bは今回はnとtの間で失敗します。正規表現エンジンには記憶されているバックトラッキング位置がなくなったため、失敗を宣言します。integerを考えてみましょう。単語境界のため、これらは明らかに一致しません。それほど明白ではないのは、正規表現エンジンがこれを理解するためにかなりの労力を費やすことです。\brととsin\bと\binbin. を考えてみましょう。単語境界のため、これらは明らかに一致しません。それほど明白ではないのは、正規表現エンジンがこれを理解するためにかなりの労力を費やすことです。nととtintegers
integerと対象文字列\bを考えてみましょう。単語境界のため、これらは明らかに一致しません。それほど明白ではないのは、正規表現エンジンがこれを理解するためにかなりの労力を費やすことです。integerは文字列の先頭で一致し、integerはintegersの先頭の6文字と一致します。正規表現エンジンは、グループ内にさらに2つの選択肢があることに注意し、\bで続行します。これは、rとsの間では一致に失敗します。そのため、エンジンはバックトラックして、グループ内の2番目の選択肢を試します。2番目の選択肢はinsertの先頭の2文字であるinと一致しますが、その後、\bとの一致に失敗します。そのため、エンジンはもう一度バックトラックして、3番目の選択肢を試します。 \bは今回はnとtの間で失敗します。正規表現エンジンには記憶されているバックトラッキング位置がなくなったため、失敗を宣言します。\b
キャプチャグループをアトミックグループ\b(?>integer|insert|in)\bに変換することで、これを行うことができます。integerが一致すると、エンジンはアトミックグループから抜け、選択のために保存したバックトラッキング位置を破棄します。\bが失敗すると、エンジンはすぐに諦めます。この節約は、キーワードの長いリストのために大きなファイルをスキャンする場合に重要になります。この節約は、選択肢にカタストロフィックバックトラッキングにつながる繰り返しトークン(繰り返しグループは言うまでもありません)が含まれている場合に不可欠です。は文字列の先頭で一致し、integerはintegersの先頭の6文字と一致します。正規表現エンジンは、グループ内にさらに2つの選択肢があることに注意し、\bで続行します。これは、rとsの間では一致に失敗します。そのため、エンジンはバックトラックして、グループ内の2番目の選択肢を試します。2番目の選択肢はinsertの先頭の2文字であるinと一致しますが、その後、\bとの一致に失敗します。そのため、エンジンはもう一度バックトラックして、3番目の選択肢を試します。 \bは今回はnとtの間で失敗します。正規表現エンジンには記憶されているバックトラッキング位置がなくなったため、失敗を宣言します。\bを考えてみましょう。単語境界のため、これらは明らかに一致しません。それほど明白ではないのは、正規表現エンジンがこれを理解するためにかなりの労力を費やすことです。\b
すべてのグループをアトミックにするのは早計です。上記の最初の例で見たように、アトミックグループ化は有効な一致も除外する可能性があります。\b(?>integer|insert|in)\bと\b(?>in|integer|insert)\bがinsertに適用されたときの動作を比較してください。前者の正規表現は一致しますが、後者は一致しません。グループがアトミックでなかった場合、両方の正規表現は一致します。選択は選択肢を左から右に試行することに注意してください。2番目の正規表現がinと一致する場合、アトミックグループのため、他の2つの選択肢は試行されません。inin
ページURL: https://regular-expressions.dokyumento.jp/atomic.html
ページ最終更新日: 2022年11月21日
サイト最終更新日: 2024年3月15日
Copyright © 2003-2024 Jan Goyvaerts. All rights reserved.