2013-11-04 43 views
1

我試圖從html中提取一些名稱。例如,字符串可能看起來像這樣:將非英文字符與 w匹配

Doe, J 

我使用的模式是:只要名字由來自英文字母表的字母

\w+, \w 

,一切工作正常。相同的圖案不符合西班牙或波蘭語的名稱:

Cortázar, J 
Król, S 

顯然特定字符有問題。任何想法如何使\ w匹配這些字符?我看着NSRegularExpression options,但我不認爲它支持它。或者也許我在這裏錯過了這一點,我應該拿出更聰明的正則表達式?

回答

0

NSRegularExpression似乎不能很好地匹配unicode字符,你可以做的是將所有內容匹配到分隔符,我假設你有?

^(\X+?),$ 

這將創建一個包含所需結果的捕獲組,並且它應該與unicode匹配。

您還可以使用匹配的字符表達式\u\p。這可以看到here。這article描述他們。

+0

在你鏈接的文章中,我實際上找到了正確的解決方案,因爲NSRegularExpression支持\ X我可以使用它作爲dot(。)的unicode版本,只是使它不貪婪。 – lawicko

+0

好吧我已經改變了答案以反映這一點,謝謝。 –

+0

相反,NSRegularExpression似乎與Unicode字符相匹配 - 至少是我嘗試過的。舉一個例子,你可以看到我的答案。或者,更好的辦法是自己嘗試:-)但有一點需要注意:'\ b'需要'w'標誌(如'(?w:)')來檢測非ASCII字符的字邊界。更多信息在這裏:http://userguide.icu-project.org/strings/regexp – Monolo

1

\w的其中一個問題是您需要將其轉換爲字符串,並且所有反斜槓都正確轉義。

NSArray *names = @[@"Cortázar, J", @"Król, S", @"Don't Match This", @"Doe, J", @"Høegh, K"]; 

NSString *pattern = @"\\w+, \\w"; 
NSPredicate *pred = [NSPredicate predicateWithFormat: @"self MATCHES %@", pattern]; 

NSArray* result = [names filteredArrayUsingPredicate: pred]; 

它正確地匹配的名字,但省去了在指數的「錯誤」的字符串2.

這說明作謂語,發動機採用相同的正則表達式語法,你可以搭配一個NSRegularExpression琴絃。

編輯補充:

如果你堅持直接使用NSRegularExpression,那麼你就可以看到它多一點的代碼工作:

// The names and pattern variables taken from code above 

NSError *error = NULL; 
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern 
                     options:NSRegularExpressionCaseInsensitive 
                     error:&error];  

for (NSString *string in names) { 

    NSRange rangeOfFirstMatch = [regex rangeOfFirstMatchInString:string options:0 range:NSMakeRange(0, [string length])]; 
    if (!NSEqualRanges(rangeOfFirstMatch, NSMakeRange(NSNotFound, 0))) { 
     NSString *result = [string substringWithRange:rangeOfFirstMatch]; 
     NSLog(@"Match: '%@'", result); 
    } 
    else { 
     NSLog(@"No match: '%@'", string); 
    } 
} 

你會看到它的名字相匹配,無論是純ASCII還是各種歐洲重音字符,但不匹配字符串「不匹配這個」。

+0

我不知道這與我的問題有什麼關係,有什麼我可以做\ w匹配與NSRegularExpression的名稱? – lawicko

+0

@lawicko它與你的問題有很大關係,我希望 - 謂詞引擎只是一種簡單的編碼方式,以便快速驗證概念。我重新編寫了示例,以便在格式字符串中不使用文學正則表達式模式,因此這兩個示例現在可以直接比較。無論如何,編輯答案來添加一個用'NSRegularExpression'完成的例子。它只是需要更多的代碼來表明它的工作原理。 – Monolo

+0

這一定是神奇的:)我昨天想要做的相同比賽現在神奇地工作,我不知道爲什麼:)感謝解釋,我實際上不再使用\ w,因爲我發現我的數據有時會來與化合物名稱,所以我使用更普遍的匹配來過濾它。無論如何,看起來\ w完全匹配unicode字符,並且很高興知道NSPredicate在下面使用相同的正則表達式引擎。 – lawicko