2016-06-23 65 views
4

我必須在C++的正則表達式中使用unicode範圍。基本上我需要的是有一個正則表達式來接受所有有效的unicode字符..我只是試着用測試表達式並面對一些問題。如何在C++正則表達式中使用Unicode範圍


std::regex reg("^[\\u0080-\\uDB7Fa-z0-9!#$%&'*+/=?^_`{|}~-]+$"); 

是問題是\\u

+0

刪除'\\ u0080 - \\ uDB7F'和嘗試匹配'124'。如果匹配,是的,問題出在'\\ u0080 - \\ uDB7F'上。 –

+0

問題是C++沒有可用的Unicode支持。使用類似ICU的東西。 –

+0

或者Boost也是一個不錯的選擇。順便說一句,[檢查此](http://en.cppreference.com/w/cpp/regex/ecmascript):* UnicodeEscapeSequence *是字母'u'後面緊跟四個* HexDigits *。此字符轉義匹配代碼單元等於此四位十六進制數字的數字值的字符。如果該值不適合此std :: basic_regex的* CharT *,則會拋出std :: regex_error(僅限C++)。 –

回答

3

這應該很好,但你需要使用std::wregexstd::wsmatch。您需要將源字符串和正則表達式轉換爲字符unicode(Linux上的UTF-32,Windows上的UTF-16(ish))以使其工作。

這對我的作品,其中源文本是UTF-8

inline std::wstring from_utf8(const std::string& utf8) 
{ 
    // code to convert from utf8 to utf32/utf16 
} 

inline std::string to_utf8(const std::wstring& ws) 
{ 
    // code to convert from utf32/utf16 to utf8 
} 

int main() 
{ 
    std::string test = "[email protected]神諭.com"; // utf8 
    std::string expr = "[\\u0080-\\uDB7F]+"; // utf8 

    std::wstring wtest = from_utf8(test); 
    std::wstring wexpr = from_utf8(expr); 

    std::wregex we(wexpr); 
    std::wsmatch wm; 
    if(std::regex_search(wtest, wm, we)) 
    { 
     std::cout << to_utf8(wm.str(0)) << '\n'; 
    } 
} 

輸出:

神諭 

注:如果你需要我在使用THIS ONE一個UTF轉換庫上面的例子。

編輯:或者,你可以使用這個答案中給出的函數:

Any good solutions for C++ string code point and code unit?

+0

很好的答案,謝謝! ''\\ u0080 - \\ uDB7F] +'範圍覆蓋了什麼? 'A-Z'?就此而言,「[a-zA-Z0-9]」的正則表達式是什麼? – SexyBeast

+0

@SexyBeast我剛剛從OP問題中複製了該範圍。但你可以在這裏看到它包含的內容:http://www.idevelopment.info/data/Programming/character_encodings/PROGRAMMING_character_encodings.shtml你寫的東西應該在正則表達式中工作得很好。 – Galik