2016-03-31 8 views
0

は私が正規表現の発現と二重のバックスラッシュ

People list 
[Jane] 
Female 
31 
... 

の形でテキストファイルを読んでいると、各行のために、私はをループにしたいと含まれている行を見つけます「[...]」例えば 、[ジェーン]

私は

正規表現表現

"(^ [\ W +] $)" を思い付きました

私はそれがregex101.comを使って動作することをテストしました。 しかし、私は自分のコードでそれを使用しようとすると、それは何にも合致しません。 は、ここに私のコードです:私はこのコードを実行すると

void Jane::JaneProfile() { 
    // read each line, for each [title], add the next lines into its array 
    std::smatch matches; 
    for(int i = 0; i < m_numberOfLines; i++) { // #lines in text file 
     std::regex pat ("(^\[\w+\]$)"); 
     if(regex_search(m_lines.at(i), matches, pat)) { 
      std::cout << "smatch " << matches.str(0) << std::endl; 
      std::cout << "smatch.size() = " << matches.size() << std::endl; 

     } else 
      std::cout << "wth" << std::endl; 
    } 
} 

は、すべての行が他のループに行くと何も一致していない...私は答えをアップ検索

が、私がいることを見たとき、私は混乱しましたC++の場合は、二重バックスラッシュを使用してエスケープする代わりにバックスラッシュを1つ使用する必要があります...しかし、二重バックスラッシュを使用しても、私のコードではうまくいかない... どこが間違っていましたか?ところで

は、私が(デスクトップ)のQt 5.5.1(クラン6.1(アップル)、64ビット)に基づいてのQt Creatorを3.6.0を使用してい

---編集----

std::regex pat (R"(^\[\\w+\]$)"); 

しかし、私は宣言されていない識別子 'R'

使用するというエラーが出ます:

私はやってみました10

私は既に#include <regex>を持っていますが、別のものを含める必要はありますか?

+1

たぶん、あなたは何をエスケープする必要はありませんので、C++ 11個の生リテラル文字列を使用する必要があります。 'std :: string str = R"(...) ";'これは 'td :: regex pat(R"(^ \ [\ w + \] $)) ");' –

+0

Ah 、私はそれを試みたが、私はエラー ''宣言されていない識別子の使用 'R' ' - あなたはおそらくなぜ知っていますか? – Ceria

+0

コンパイラのどのバージョンですか? –

答えて

1

いずれかのバックスラッシュをエスケープするか、正規表現には表示されません接頭辞で、生の文字バージョンを使用します。

はエスケープ:

std::regex pat("^\\[\\w+\\]$"); 

生の文字列:

std::regex pat(R"regex(^\[\w+\]$)regex"); 

を作業デモ(OPの投稿コードから適合):

#include <iostream> 
#include <regex> 
#include <sstream> 
#include <string> 
#include <vector> 

int main() 
{ 
    auto test_data = 
    "People list\n" 
    "[Jane]\n" 
    "Female\n" 
    "31"; 

    // initialise test data 
    std::istringstream source(test_data); 
    std::string buffer; 
    std::vector<std::string> lines; 
    while (std::getline(source, buffer)) { 
     lines.push_back(std::move(buffer)); 
    } 

    // test the regex 

    // read each line, for each [title], add the next lines into its array 
    std::smatch matches; 
    for(int i = 0; i < lines.size(); ++i) { // #lines in text file 
     static const std::regex pat ("(^\\[\\w+\\]$)"); 
     if(regex_search(lines.at(i), matches, pat)) { 
      std::cout << "smatch " << matches.str() << std::endl; 
      std::cout << "smatch.size() = " << matches.size() << std::endl; 
     } else 
      std::cout << "wth" << std::endl; 
    } 

    return 0; 
} 

予想される出力:

wth 
smatch [Jane] 
smatch.size() = 2 
wth 
wth 
+0

残念ながら、最初の式を使用すると、テキストファイルとの一致が見られません。私が2番目の式を使用するとき、私はまだエラーが発生します。 "未宣言の識別子 'R'の使用:( – Ceria

+0

@CeriaはAppleのclangで私のMacでテストしました –

+0

@Ceriaちょっと考えましたか?あなたのテキストファイルは、UNIXの場合のようにLFではなくCR/LFの行を終了する可能性があります。そうであれば、各文字列を読み込んでCRを取り除くか、適切なオペレーティングシステムを取得する必要があります:) –

関連する問題