0

Boostで単純な文構造を解析しようとしています。Boost を使用するのはこれが初めてなので、これは完全に間違っている可能性があります。私がやりたいことは、この形式の文字列のみを受け入れることです:

  • 文字で始める必要があります (大文字と小文字は区別されません)
  • 含有することができます:
    • 英字
    • 数字
    • アンダースコア
    • ハイフン
  • 他のすべての文字は区切り文字として機能します

どの文字が区切り文字なのかわからないので (たくさんあるかもしれません)、それに敏感な正規表現を作ろうとしました。唯一の問題は、各単語の最後の文字しか取得できないことです。これにより、私の正規表現は正しいと信じるようになりますが、ブーストの使用はそうではありません。これが私のコードです:

boost::regex regexp("[A-Za-z]([A-Za-z]|[0-9]|_|-)*", boost::regex::normal | boost::regbase::icase);
boost::sregex_token_iterator i(text.begin(), text.end(), regexp, 1);
boost::sregex_token_iterator j;
while(i != j){
    cout << *i++ << std::endl;
}

これは、 Boost Web サイトで見つけたものをモデルにしています。mf コードを作成するためのテンプレートとして、最後の例 (ページの下部) を使用しました。この例では、テキストは文字列型のオブジェクトです。

私の正規表現は正しいですか?ブーストを正しく使用していますか?

4

2 に答える 2

2

正規表現を次のように変更します。([A-Za-z][-A-Za-z0-9_]*)

式全体を括弧で囲むと、最後に一致した文字だけでなく、全体がキャプチャされます。- を前に置くと、範囲指定子ではなく、一致する文字になります。

于 2011-03-09T12:31:46.027 に答える
1

RE マッチごとに最初のサブマッチをリクエストしています。それはこの部分式を参照し([A-Za-z]|[0-9]|_|-)ます: そして、各一致に対して最後に一致したものを取得しています ( a によって修飾されていることに注意してください*)。したがって、最後の文字。サブマッチ番号に 0 を渡すか、そのパラメーターを省略すべきだと思います。それを行うためにコードを変更すると、あなたが望んでいると思うことを実行します。

于 2011-03-09T12:49:24.190 に答える