サブルーチンを呼び出すことは可能だが、その呼び出しの結果をキャプチャすることはできないのだろうかと思っていた。例えば非キャプチャサブルーチン
、のは、私は再帰的に
私が使用することができ{dfsdf {sdfdf {{dfsdf}}} dfsf}
のようなバランスブラケット{}構造と一致してキャプチャしたいとしましょうこの正規表現:
最初のグループは私がキャプチャしたいものです。
しかし巣 "の私の定義:
(?'nest' ...)
と '巣' サブルーチンへの私の再帰呼び出し:
(?&nest)
もグループをキャプチャしています。私は正規表現をより効率的にし、それらのグループをキャプチャしないことでスペースを節約したいと思います。これを行う方法はありますか?
編集:サブルーチンの定義をキャプチャすることは不可能です。そのパターンは、別の場所で使用するためにキャプチャする必要があるためです。
EDIT2:
私はブースト::正規表現だけでなく、メモ帳++正規表現でこの正規表現をテストしています。彼らは実際に私には奇妙な異なるキャプチャグループを定義しているようです。私は彼らがデフォルトでPerlの正規表現を使用しているという印象を受けています。
^\w+\s+[^\s]+\s+(?'header'(?'nest'\{(?>[^{}]|(?&nest))*\}))(?>\s+[^\s]+){5}\s+(?'data'(?>\{(?>[^{}]|(?&nest))*\}))\s+(?'class'(?>\{(?>[^{}]|(?&nest))*\}))
私は、後に「巣」はすでにカプセル化されたことを不必要な文字が含まれて実現:
はとにかく、質問をすると、私は正規表現を持っていました。そして、私が今持っている:
^\w+\s+[^\s]+\s+(?'nest'\{(?>[^{}]|(?&nest))*\})(?>\s+[^\s]+){5}\s+((?&nest))\s+((?&nest))
メモ帳++は、私はそれが私に語ったREPLACE文
\\1: \1 \n \\2: \2 \n 3: \3 \n 4: \4
を行う際に「1件の発生が交換された、次の発生は見られない」3つのキャプチャグループで私を提供します。 4:の後に置換えのテキストがないので、4番目のキャプチャグループが存在しないと私に信じさせます。
もつともブースト:: 6つの位置にオブジェクトを返すregex_match:
0:マッチに対するメタデータ
1:全体のマッチ
2:全体の一致
3: group1 from notepad ++
4:notepadからのグループ2 ++
5:私は、パズルのさらに別の部分を誤解し、私はまだポジション1の送信と2
EDIT3
を作成しようとしている
++メモ帳からグループ3 ...
boost :: cmatch.m_subs [i]!boost :: cmatch [i]
私はそれらが等しいと思った。もう少しデバッグした後、オブジェクトへのインデックス付けは、ドキュメントの説明どおりに動作します。しかし、私は間違って、オブジェクトにboost :: cmatch [i]が返すものを反映する構造体を含むと仮定しました。 boost :: cmatch [i]はまず、== falseにマッチしたm_subsからすべてのエントリを削除します。残りのエントリは、boost :: cmatch [i]が返すものと並んでいます。
文字列の先頭にある '{...}'平衡部分文字列と一致する必要がある場合は、非取得サブルーチン呼び出しを使用する方法がありません。 –
これには何らかの理由がありますか?その機能は正規表現の機能性を向上させるようです。 – Derek
私はむしろ早すぎる最適化と呼んでいます。 –