我必須在C++的正則表達式中使用unicode範圍。基本上我需要的是有一個正則表達式來接受所有有效的unicode字符..我只是試着用測試表達式並面對一些問題。如何在C++正則表達式中使用Unicode範圍
std::regex reg("^[\\u0080-\\uDB7Fa-z0-9!#$%&'*+/=?^_`{|}~-]+$");
是問題是\\u
?
我必須在C++的正則表達式中使用unicode範圍。基本上我需要的是有一個正則表達式來接受所有有效的unicode字符..我只是試着用測試表達式並面對一些問題。如何在C++正則表達式中使用Unicode範圍
std::regex reg("^[\\u0080-\\uDB7Fa-z0-9!#$%&'*+/=?^_`{|}~-]+$");
是問題是\\u
?
這應該很好,但你需要使用std::wregex
和std::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
轉換庫上面的例子。
編輯:或者,你可以使用這個答案中給出的函數:
刪除'\\ u0080 - \\ uDB7F'和嘗試匹配'124'。如果匹配,是的,問題出在'\\ u0080 - \\ uDB7F'上。 –
問題是C++沒有可用的Unicode支持。使用類似ICU的東西。 –
或者Boost也是一個不錯的選擇。順便說一句,[檢查此](http://en.cppreference.com/w/cpp/regex/ecmascript):* UnicodeEscapeSequence *是字母'u'後面緊跟四個* HexDigits *。此字符轉義匹配代碼單元等於此四位十六進制數字的數字值的字符。如果該值不適合此std :: basic_regex的* CharT *,則會拋出std :: regex_error(僅限C++)。 –