2016-04-05 51 views
0

我在C++中使用boost正則表達式解析文本文件。我正在尋找文件中的'\'字符。這個文件還包含一些Unicode字符「\ u」。那麼,有沒有辦法將'\'和'\ u'字符分開。 下面是我解析如何在C++中使用boost正則表達式分析轉義元素''和unicode字符' u'

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

繼test.txt的內容是我嘗試

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

      } 

     } 

    } 
} 

現在,當我使用上面的代碼將打印以下

"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 

而不是我想要以下

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

我認爲代碼無法區分'\'和'\ u',但我不知道要在哪裏更改。

+0

由於註釋掉的語句,您的當前代碼不會生成您顯示的輸出。另外,運行這兩項檢查有什麼問題? (無論如何這是一種有缺陷的方法,或許更好的辦法是不要一次使用正則表達式並檢查一個反斜槓,從頭到尾。「讓我們使用一個正則表達式 - 現在你有兩個問題。」) – usr2564301

+0

如果我們保持此代碼爲然後是「ID」字段顯示兩次。即「ID」被認爲是Unicode和(\)發現一個 – kkard

+0

我已經刪除了評論,現在我認爲代碼應該工作 – kkard

回答

1

嘗試在你的第一個正則表達式中使用[^ u]來匹配任何不是你的字符。

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

這可能是最好的使用一個正則表達式。

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

然後檢查部分匹配m[1]是 'U':

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

這是更好地使用正則表達式模式匹配。它們看起來比較複雜,但一旦習慣了它們,它們實際上更容易維護,並且比一次一個字符地迭代字符串更少出錯。

相關問題