2017-02-01 9 views
2

私はこの奇妙な現象に遭遇しました。私がifstreamを使ってファイルの内容をプログラムに送り、入ってくる言葉に正規表現を適用すると、ドイツの手紙äöüは私にいくつかの困難をもたらします。これらのうちのいずれかが単語の先頭に現れた場合、正規表現はそれらを認識することはできませんが、単語の中にこれらの文字のいずれかが現れる場合は認識されません。したがって、これらの行ドイツ語のUmlauteと正規表現

string word = "über"; 
regex check {R"(\b)" + word + R"(\b)", regex_constants::icase}; 
string search = "Es war genau über ihm."; 

正規表現は、文字列検索でuberを見つけることができないため動作しません。しかし、

string word = "für"; 
regex check {R"(\b)" + word + R"(\b)", regex_constants::icase}; 
string search = "Es war für ihn."; 

は、単語にüが表示されるために機能します。それはなぜですか、どうすればこの問題を解決できますか?私はすべてのueをueで置換し、すべてのäをaeとすべてのöで置換し、後で置換えを元に戻すことを考えましたが、もう1つの可能性はありますか?私はVisual Studio 2015で作業しています。

+1

これは文字セットの問題ですか?すべてがUTF-8なのか何か他のものはありますか? – tadman

答えて

1

代わりにregex check {"(^|[\\x60\\x00-\\x2f\\x3a-\\x40\\x5b-\\x5e\\x7b-\\x7e])über($|[\\x60\\x00-\\x2f\\x3a-\\x40\\x5b-\\x5e\\x7b-\\x7e])", regex_constants::icase};を使用してください。

C++正規表現のデフォルトの文法は、JavaScriptに似ています。 \b doesn't support Unicode

And from microsoft.com

  • 現在の文字が、標的配列の先頭で、次のいずれかです。単語の境界には、以下の状況で発生し

    ワード境界

    単語文字A-Za-z0-9_。

  • 現在の文字位置はターゲットシーケンスの最後を過ぎており、ターゲットシーケンスの最後の文字は ワードキャラクタの1つです。

  • 現在の文字は単語の文字の1つで、前の文字はそうではありません。

  • 現在の文字は単語の文字の1つではなく、直前の文字はです。

+0

これらの数字の意味は?彼らは文字のために立っていますか? – AlexM

+0

@AlexM '[\\ x60 \\ x00 - \\ x2f \\ x3a - \\ x40 \\ x5b - \\ x5e \\ x7b - \\ x7e]' A-Za-z0- 9_'。すべての共通の句読点に一致します。 – cshu

+0

@AlexMこの正規表現は、 'A-Za-z0-9_'と同じ方法ですべての非ASCII文字を認識します。それは他の文字と同じように特別なUnicodeの句読点を扱います。例えば'.'と'ü'も同じように扱われます。 – cshu

関連する問題