Pattern
標準ライブラリでこれを行う簡単な方法はありません。
のソース コードPattern
Node
は、再帰降下パーサーを使用して、それぞれがメソッドをサポートするオブジェクトのツリーを作成しますmatch()
。たとえば、 を評価するために、可能な選択肢のリストを格納|
するBranch
サブクラスが 4107 行にあります。そのmatch()
メソッドは各選択肢を試行し、選択肢true
のいずれかが一致し、後続ノードが一致する場合に戻ります。それ以外の場合は を返しますfalse
。
グループは、各グループの開始位置と終了位置をクラスのプライベート変数に保存する特別なノードGroupHead
とノードを解析ツリーに挿入することによって保存されます。GroupTail
Pattern
パターンのどの部分が一致したかを調べるには、ノード オブジェクトは、それらが作成される原因となったパターンの部分を知る必要があります。パーサーは、作成したノードにその情報を保存しません。元のパターンはtemp
配列に格納され、再帰降下パーサーは解析時cursor
に配列にインデックスを保持temp
します。peek()
やのようなパーサー ヘルパー メソッドはaccept()
、1567 行目から定義されており、必要に応じて単純にインクリメントcursor
されます。ノードが作成されるとき、 の値はcursor
どこにも保存されません。しかし、その値は、パターンのどの部分が一致に対応するかを再構築するために必要です。
がこの情報を保存しない理由は理解できPattern
ます。すべての正規表現の評価が遅くなりますが、追加機能はほとんど使用されません。
Pattern
1 つの可能性は、一致を元のパターンの部分まで追跡するために適切な簿記を行うの修正版を作成することです。各ノードが対応するパターンの部分を保存するために、Node()
コンストラクターにcursor
フィールドのコピーを隠しておくことで解決できる場合があります。しかし、そのデータを使用してパターンのどの部分が一致したかを見つけるには、すべてNode
のサブクラスのmatch()
メソッドを更新して、…の各サブクラスのセマンティクスに基づいて範囲を格納する必要がありNode
ます。
幸運を!