2016-04-11 16 views
1

boostの正規表現でキャプチャグループの名前を取得する方法を知りたいと思います。boost regexの名前付きキャプチャ/グループのリスト

たとえば、名前付きキャプチャグループで有効な正規表現であると予想される文字列をユーザーが入力した場合、正規表現内の定義済みグループのリストを反復してそれらのグループの名前を取得する方法を教えてください。 boostはそうするための設備を提供していますか、または私はそれらの名前を抽出するために私自身のパーサーを書くことが期待されていますか?一例として、

、入力文字列がある場合:

(?<year>[0-9]{4}).*(?<month>[0-9]{2}).*(?<day>[0-9]{2}) 

は、私は正規表現のうち、「年」、「月」、および「日」を抽出することができるようにしたいです。

+0

おそらく、あなたは正規表現をboost regexにコンパイルしてから、そこからキャプチャ名を得ることができます。これを行うことができますが、名前付きのサブ式に問題があります。技術的には、正規表現が解析されると、各名前はハッシュに変換され、ベクタに落とされます。ここで、さらなる参照はidを介して行われます。 boost_regex.hppの 'class named_subexpressions'を見てください。実際の文字列名のマップを作成するように変更することができます。コールを追加してグループインデックス名を取得できる場所。 – sln

+0

(申し訳ありませんが、ソースはbasic_regex.hppでなければなりません)私はこれを行う数行を投稿できますが、エンジンを再コンパイルする必要があります。これが合法であるかどうかはわかりません。 – sln

+0

これは次のようなものです:classname_subexpressions {public:... voidset_name(constcharT * i、constcharT * j、intindex){... std :: stringstmp(i、j); intalen =(int)stmp.length(int) )}; std :: stringget_name(intndx)const {if(longest_name> 0){autogroupName = m_sub_sNames.find(long)}この例では、 (int); std :: string m_sub_sNames;};}};}}};}}}}}}}}}}}}}}}}}}}}}}}}}}}である。 ...}; ' – sln

答えて

0

次の正規表現を使用することができます。

"\?<([^<>]+)>" 

私はそれが入力された正規表現を横断する必要があるため、正規表現エンジンは、正規表現をコンパイルする前に、あなたにキャプチャグループの名前を与えるために、このような機能を提供することを考えていません正規表現を一度コンパイルしてすべてのジョブを一緒に実行しない限り、最適な方法ではない正規表現を解析(およびコンパイル)する前に一度実行します。

あなたのコメントに関しては、名前のないグループがある可能性がある場合は、キャプチャしたグループをループして名前がないかどうかを確認することをお勧めします。

名前のついていないグループが正規表現であるケースを解析することもできますが、一般的な方法ではないと思います。

たとえば、あなたは(のことを確認します[^()]*)それらの中に別のキャプチャグループを持たないすべてのグループをキャプチャするために、括弧の中に上記の正規表現を使用することができます。

`\((\?<([^<>]+)>)[^()]*\)` 

そして、あなたが持っている別の例についてもう一つ書きなさい。

+0

お返事ありがとうございます。これが正規表現エンジンによって提供されているかどうかを知ることはもっと興味がありました。私はそのような施設を見つけようとしましたが、無駄でした。抽出された名前がどのキャプチャグループに属しているかを知る方法はありますか? 2番目のキャプチャグループが入力正規表現... ...(? [0-9] {4})。*([0-9] {2})。*(? [0-9] {2}) 'その日は実際に第3の捕獲集団を指していることがわかりますか? – Arash

+0

@Arashようこそ、お楽しみください編集してください。 – Kasramvd

関連する問題