2016-08-30 87 views
0

我正在使用Embarcadero的C++ Builder開發拼寫檢查應用程序。我使用正則表達式將文本分成單個單詞。下面的代碼在RAD Studio XE上運行良好,但是與RAD Studio Seattle沒有相同的行爲。使用RegEx在Embarcadero的C++ Builder中將文本拆分爲單個單詞

當單詞包含非拉丁字符(如德語變音符號Ä,Ö,Ü)或帶有重音符號(é,ê,à)的字符時,會出現此問題。 「\ w」被解釋爲[a-zA-Z_0-9]忽略非拉丁字符。

首先,我的語境中的單詞是什麼? 可能的話包括:

  • 「\ r \ n」 個

  • 「字字字字...」

  • 「字。」或 「字處理」

  • 詞語與apostrophs: 「 '」 「一詞wor'd」, 「字」'

  • 「字」

  • 有兩種不同類型的撇號:'和「

下面的代碼:

String text (L"Österreich l'année); 
const String sRegex (L"\r\n|(\\w+\\-)+\\w+|\\w+(\\.|\\-)|('|’)?\\w+('|’)?\\w*"); 
TRegEx regex(sRegex, TRegExOptions()); 
TMatchCollection regexMatches = regex.Matches(text); 
for (int i=0; i<regexMatches.Count; ++i) 
{ 
    TMatch regexMatch = regexMatches.Item[i]; 
    String word (regexMatch.Value); 

    //do stuff with word 
} 

所需字符串單詞的值是「Österreich」和「l'année」。但是,RegEx匹配的是「sterreich」,「l'ann」和「e」。

我的問題是,如何指定所有非拉丁字符?

+1

不知道你是否支持它,但也許你可以從'[\ p {L}'] *'工作。 [請參閱regex101](https://regex101.com/r/jU0rV7/1)。 – ClasG

+0

進行小測試:如果您的正則表達式爲PCRE,請在模式開頭添加'(* UTF)(* UCP)'。如果這不起作用,您可能會處理JS ECMAScript 5正則表達式,它不支持Unicode。 –

+0

謝謝,使用\ p {L}而不是\ w工作! –

回答

1

\p{L}匹配unicode字母。嘗試使用,而不是\w

See it here at regex101

如果您還想要數字(與\w一樣),請將\d添加到組中。

+0

並避免評論;) - by * unicode letter *我的意思是一個unicode代碼點在字母類別。 * unicode字母*雖然簡化了答案(imo)。 – ClasG

+2

只需添加:'\ p {L}'只匹配基本字母,如果需要匹配變音符號,則添加'\ p {M}' - '[\ p {L} \ p {M} ]'。一個數字類也可以被添加(因爲原來的'\ w'包含數字)。 –

相關問題