2016-04-05 2 views
0

Ich analysiere eine Textdatei mit Boost Regex in C++. Ich suche nach \ 'Zeichen aus der Datei. Diese Datei enthält auch einige Unicode-Zeichen. Also, gibt es eine Möglichkeit, '\' und '\ u' Zeichen zu trennen. Im Folgenden Inhalt von test.txt, die ichWie man das Escape-Element '' und das Unicode-Zeichen ' u' mit Boost-Regex in C++ analysiert

"ID": "\u01FE234DA - this is id ", 
"speed": "96\/78", 
"avg": "\u01FE234DA avg\83" 

Nach bin Parsen ist mein Versuch

#include <boost/regex.hpp> 
#include <string> 
#include <iostream> 
#include <fstream> 

using namespace std; 
const int BUFSIZE = 500; 

int main(int argc, char** argv) { 

    if (argc < 2) { 
     cout << "Pass the input file" << endl; 
     exit(0); 
    } 

    boost::regex re("\\\\+"); 
    string file(argv[1]); 
    char buf[BUFSIZE]; 

    boost::regex uni("\\\\u+"); 


    ifstream in(file.c_str()); 
    while (!in.eof()) 
    { 
     in.getline(buf, BUFSIZE-1); 
     if (boost::regex_search(buf, re)) 
     { 
      cout << buf << endl; 
      cout << "(\) found" << endl; 
      if (boost::regex_search(buf, uni)) { 
       cout << buf << endl; 
       cout << "unicode found" << endl; 

      } 

     } 

    } 
} 

Nun, wenn ich oben Code verwenden, druckt er folgende

"ID": "\u01FE234DA - this is id ", 
(\) found 
"ID": "\u01FE234DA - this is id ", 
unicode found 
"speed": "96\/78", 
(\) found 
"avg": "\u01FE234DA avg\83" 
(\) found 
"avg": "\u01FE234DA avg\83" 
unicode found 

Statt Ich möchte folgende

"ID": "\u01FE234DA - this is id ", 
unicode found 
"speed": "96\/78", 
(\) found 
"avg": "\u01FE234DA avg\83" 
(\) and unicode found 

Ich denke, der Code ist nicht in der Lage, '\' und '\' getrennt zu unterscheiden, aber ich bin mir nicht sicher, wo ich was ändern soll.

+0

Ihr aktueller Code erzeugt ** ** ** nicht die Ausgabe, die Sie aufgrund der auskommentierten Anweisungen anzeigen. Was ist falsch daran, beide Überprüfungen auszuführen? (Es ist sowieso eine fehlerhafte Methode. Wahrscheinlich wäre es besser, regex nicht zu verwenden und einen Backslash zu einem Zeitpunkt zu untersuchen, vom ersten zum letzten. "Lassen Sie uns einen Regex verwenden - jetzt haben Sie zwei Probleme.") – usr2564301

+0

Wenn wir diesen Code als behalten ist dann "ID" -Feld zweimal angezeigt. dh "ID" wird als Unicode betrachtet und (\) gefunden – kkard

+0

Ich habe die Kommentare jetzt entfernt Ich denke Code sollte funktionieren – kkard

Antwort

1

Versuchen Sie, [^ u] in Ihrer ersten Regex zu verwenden, um jedes Zeichen zu finden, das nicht u.

boost::regex re("\\\\[^u]"); // matches \ not followed by u 
boost::regex uni("\\\\u"); // matches \u 

Es ist wahrscheinlich am besten, einen Regex-Ausdruck zu verwenden.

boost:regex re("\\\\(u)?"); // matches \ with or without u 

Dann prüfen, ob die teilweise Übereinstimmung m[1] ist 'u':

m = boost::regex_search(buf, uni) 
if (m && m[1] === "u") { // pseudo-code 
    // unicode 
} 
else { 
    // not unicode 
} 

Es ist besser regex für den Mustervergleich zu verwenden. Sie scheinen komplexer zu sein, aber sie sind einfacher zu warten, wenn man sich erst daran gewöhnt hat, und weniger fehleranfällig, als wenn man Zeichenfolgen einzeln überstreichen würde.

Verwandte Themen