2016-03-31 28 views
0

BenRegex ifadesi ve çift ters eğik çizgi

People list 
[Jane] 
Female 
31 
... 

şeklinde bir metin dosyasını okuyorum ve her hat için ben döngü istiyoruz ve içerdiği satırı bulun "[...]" Örneğin [Jane]

regex ifade

"(^ [\ w +] $)"

geldi

ile regex101.com kullanarak çalıştığını test ettim. Ancak, bunu kodumda kullanmaya çalıştığımda, hiçbir şeyle eşleşmiyor. İşte benim kod: Bu kodu çalıştırdığınızda

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; 
    } 
} 

, tüm satırlar başka örgüsüne gidin ve hiçbir şey maçları ... Ben cevaplar için yukarı aradı

ama gördüğüm zaman karıştı C++ için çift ters eğik çizgi yerine bir ters eğik çizgi kullanmak zorundasınız ... Ama çift ters eğik çizgi kullandığımda bile kodumda işe yaramadı ... Nerede hata yaptım? Bu arada

, ben (Masaüstü) Qt 5.5.1 (Clang 6.1 (Elma), 64 bit) dayanarak Qt Creator 3.6.0 kullanıyorum

--- Düzenleme ----

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

Ama bildirilmemiş tanımlayıcı 'R'

ait

kullanın söyleyerek bir hata alıyorum:

yaptığım çalıştı 10

Zaten #include <regex> var, ancak başka bir şey eklemem gerekiyor mu?

+1

Belki bir şey kaçmak için gerek kalmaz C++ 11 ham edebi dizeleri kullanmak gerekir. std :: string str = R "(...)"; 'td :: regex pat (R" ((^ \ [\ w + \] $)) "); –

+0

Ah gibi bir şey olurdu Bunu denedim ama 'tanımlanamayan tanımlayıcı' R '' bir hata alıyorum - belki nedenini biliyor musun? – Ceria

+0

Derleyicinin hangi sürümü var? –

cevap

1

Ya ters eğik çizgi kaçış veya regex görünmez bir önek ile ham karakter sürümünü kullanın:

kaçan:

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

ham karakter dizesi:

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

çalışan demo (OP'lerin gönderdiği koddan uyarlanmıştır):

#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; 
} 

beklenen çıkışı:

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

Maalesef, ilk ifadeyi kullandığımda, metin dosyasından bir eşleşme görmüyorum; ve ikinci ifadeyi kullandığımda hala "cümle tanımlanmamış 'R'" :( – Ceria

+0

@ Ceria benim macun üzerinde elma clang ile test edin. –

+0

@Ceria sadece bir düşünce - bir windows makinede misin? metin dosyası muhtemelen Unix'te olduğu gibi LF yerine CR/LF ile satırları sonlandırır.Yaparsa, her dizeden okuduğunuzda CR'yi kesmeniz gerekir ... ya da uygun bir işletim sistemi olsun :) –

İlgili konular