2012-03-24 4 views
1

すべての浮動小数点を検索しようとしています(接頭辞が -/+の指数形式である可能性があります)。たとえば、有効な形式は次のとおりです。-1.2 +1.2 .2 -3 3E4 -3e5 e-5この正規表現はすべての有効な浮動小数点数を解析できません

テキストのソースには、スペースまたはコンマで区切られた複数の数字が含まれています。私は任意の無効な番号(例えば1.2 3.2 S3)S3がある場合は教えてくれ

  1. を伝えるために、正規表現を使用する必要があることは、私がいない持っているすべての単一の有効な番号

有効なもの

  • リストではありません(1)で行わが、(2)のために取得する方法のアイデアは、私はブーストを使用しています::正規表現と、次のコード

    wstring strre("[-+]?\\b[0-9]*\\.?[0-9]+(?:[eE][-+]?[0-9]+)?\\b"); 
    wstring src("1.2 -3.4 3.2 3 2 1e-3 3e3"); 
    boost::wregex regexp(strre); 
    boost::match_results<std::wstring::const_iterator> what; 
    regex_search(src, what, regexp, boost::match_continuous); 
    wcout << "RE: " << strre << endl << endl; 
    wcout << "SOURCE: [" << src << "]" << endl; 
    
    for (int i=0; i<what.size(); i++) 
        wcout << "OUTPUT: [" << wstring(what[i].first, what[i].second) << "]"<< endl; 
    

    しかし、このコードは、私に最初の数(1.2)を示します。私もboost :: match_all、boost :: match_default、同じ結果を試してみてください。

    追加情報: こんにちは、テストコードで明示的な文字列ではなくテキストから文字列を読み込むので、二重バックスラッシュの問題は心配しないでください。今

    wstring strre("[-+]?\\b[0-9]*\\.?[0-9]+(?:[eE][-+]?[0-9]+)?\\b"); 
    boost::wregex regexp(strre); 
    boost::match_results<std::wstring::const_iterator> what; 
    wcout << "RE: " << strre << endl << endl; 
    while (src.length()>0) 
    { 
        wcout << "SOURCE: [" << src << "]" << endl; 
        regex_search(src, what, regexp, boost::match_default); 
        wcout << "OUTPUT: [" << wstring(what[0].first, what[0].second) << endl; 
        src = wstring(what[0].second, src.end()); 
    } 
    

    に従うようとにかく、私は、コードを変更し、それが正しく、すべて単一の数字を示しているが、私は、一度に1つの番号を与えるため、それにregex_searchいくつかの時間を実行する必要があります。さて、私はregex_searchがなぜ私にすべての結果を与えるのか理解できません。一度検索を実行してすべての結果を戻す方法はありますか?

  • 答えて

    2

    通常、C++文字列のバックスラッシュをダブルエスケープする必要があります。したがって、"\.".に変わります。あなたは"\\."などが必要です。同様に、"\b"は単語境界ではなく文字通りのバックスペースになります!同じ方法を修正してください:"\\b"

    また、そのstrreクラスのドキュメントはどこですか?あなたが使用している言語を理解していると思いますか?

    明らかに新しいC++標準には生の文字列リテラルがあります。これらは、Goの `backticked`文字列、Perlの` single-quoted '文字列や/ patterns/likeのように動作します。詳細は、this answerを参照してください。

    EDIT

    ここ

    浮動小数点リテラルを検出するための、やや手の込んだ模様だが、何のバックスラッシュを使用しない:それはのEREをサポートしていない先読みし、必要ない

    [+-]?(?=[.]?[0-9])[0-9]*(?:[.][0-9]*)?(?:[Ee][+-]?[0-9]+)? 
    

    注こと。おそらくPCREライブラリを使用するべきです。分解、それはPerlのRegexp::Commonライブラリの

    [+-]?     # optional leading sign 
    (?=[.]?[0-9])   # lookahead for a digit, maybe with an intervening dot 
    [0-9]*     # maybe some digits 
    (?:[.][0-9]*)?   # maybe a (dot plus maybe some digits) 
    (?:[Ee][+-]?[0-9]+)? # maybe an exponent, which may have a sign and must have digits 
    

    パターンの礼儀です。

    +0

    ありがとうございました。しかし、ノー・スラッシュ・バージョンの場合、上記のコードは、すべてのものではなく最初に一致する番号のみを取り出すことができます – user1285419

    +0

    @ user1285419スラッシュはありません。バックスラッシュはありません。異なる方法!そして、あなたがそれを漸進的/反復的に呼び出すならば、それはすべてのものを返します。 – tchrist

    関連する問題