2011-06-09 20 views
1

我有以下工作PHP代碼:php preg_match在C++中的等價物與Boost?

preg_match('/^(\d+):/', $string, $matches) 

然而,當我嘗試做它在C++中使用Boost的正則表達式庫,它不工作。

regex expression1("^(\\d+):"); 

std::string filename = "C:\\Users\\root\\Desktop\\something.bin"; 
std::ifstream ifs(filename.c_str(), std::ios::in | std::ios::binary); 
std::string contents((std::istreambuf_iterator<char>(ifs)), 
std::istreambuf_iterator<char>()); 

cmatch what; 

if(regex_match(contents.c_str(), what, expression1)) 
{ 
    cout<<"value is "<<what[1]<<endl; 
} 

而我不明白爲什麼。 regex_match與其他模式正常工作,但不與這^(\\d+):

+0

升壓是一個庫C++,而不是C. – 2011-06-09 13:53:18

+0

@develroot:「仍然不工作」沒有用。提供一個完整的,最小的測試用例來證明問題。我猜你的輸入字符串是不同的。用完整的代碼更新了 – 2011-06-09 13:54:14

+0

。 – technology 2011-06-09 14:21:44

回答

1
 | Single quotes | Double quotes | 
-----+---------------+----------------+ 
    PHP | string  |  string  | 
     | (verbatim) |    | 
-----+---------------+----------------+ 
    C++ | char  |  string  | 
-----+---------------+----------------+ 

您在PHP中使用單引號意味着\d不具有其特殊含義。

然而,正確使用你的C++雙引號(你必須這樣做,因爲在C++中的單引號字符分隔,而不是字符串)。但是現在你必須考慮令牌\d的特殊含義。

逃離反斜槓將解決你的問題:

regex expression("^(\\d+):"); 

而且你必須這樣做在PHP太多,如果你使用了雙引號字符串:

preg_match("/^(\\d+):", $string, $matches); 
0

你做錯了。在字符串中使用反斜槓意味着反斜槓需要被轉義。

嘗試"^(\\d+):"(雙反斜槓)

編輯:漿果評論,\d一個PHP單引號字符內是完全合法的。我錯誤地認爲這實際上是一種違規行爲,但是PHP會「自動」爲您自動修復。

+1

嗨。在PHP中,這不是真的,只要你在字符串周圍使用*單引號。只有雙引號才能轉義字符,單引號表示文字字符串。 – 2011-06-09 13:44:00

2

\字符開始在C字符串逃逸。嘗試"^(\\d+):"

相關問題