2016-06-23 21 views
4

C++の正規表現でユニコードの範囲を使用する必要があります。基本的に私が必要とするのは、すべての有効なUnicode文字を受け入れる正規表現を持つことです。私はテスト式を試してみて、いくつかの問題に直面しています。C++の正規表現でUnicodeの範囲を使用する方法


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

問題が\\uでありますか?

+0

削除 '\\ u0080 - \\ uDB7F'と' 124'に一致するようにしてみてください。一致すれば、問題は '\\ u0080 - \ uDB7F'です。 –

+0

問題はC++で使用可能なUnicodeサポートがないことです。 ICUのようなものを使用してください。 –

+0

またはブーストも良い選択肢です。 BTW、[これをチェックしてください](http://en.cppreference.com/w/cpp/regex/ecmascript):* UnicodeEscapeSequence *は、文字 'u'にちょうど4つの* HexDigits *が続きます。この文字エスケープは、コード単位がこの4桁の16進数の数値と等しい文字に一致します。値がこの 'std :: basic_regex'の* CharT *に収まらない場合、' std :: regex_error'がスローされます(C++のみ)。 –

答えて

3

これは正常に機能しますが、std::wregexstd::wsmatchを使用する必要があります。ソース文字列と正規表現をワイド文字ユニコード(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

関連する問題