我試圖從html中提取一些名稱。例如,字符串可能看起來像這樣:將非英文字符與 w匹配
Doe, J
我使用的模式是:只要名字由來自英文字母表的字母
\w+, \w
,一切工作正常。相同的圖案不符合西班牙或波蘭語的名稱:
Cortázar, J
Król, S
顯然特定字符有問題。任何想法如何使\ w匹配這些字符?我看着NSRegularExpression options,但我不認爲它支持它。或者也許我在這裏錯過了這一點,我應該拿出更聰明的正則表達式?
我試圖從html中提取一些名稱。例如,字符串可能看起來像這樣:將非英文字符與 w匹配
Doe, J
我使用的模式是:只要名字由來自英文字母表的字母
\w+, \w
,一切工作正常。相同的圖案不符合西班牙或波蘭語的名稱:
Cortázar, J
Król, S
顯然特定字符有問題。任何想法如何使\ w匹配這些字符?我看着NSRegularExpression options,但我不認爲它支持它。或者也許我在這裏錯過了這一點,我應該拿出更聰明的正則表達式?
\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還是各種歐洲重音字符,但不匹配字符串「不匹配這個」。
我不知道這與我的問題有什麼關係,有什麼我可以做\ w匹配與NSRegularExpression的名稱? – lawicko
@lawicko它與你的問題有很大關係,我希望 - 謂詞引擎只是一種簡單的編碼方式,以便快速驗證概念。我重新編寫了示例,以便在格式字符串中不使用文學正則表達式模式,因此這兩個示例現在可以直接比較。無論如何,編輯答案來添加一個用'NSRegularExpression'完成的例子。它只是需要更多的代碼來表明它的工作原理。 – Monolo
這一定是神奇的:)我昨天想要做的相同比賽現在神奇地工作,我不知道爲什麼:)感謝解釋,我實際上不再使用\ w,因爲我發現我的數據有時會來與化合物名稱,所以我使用更普遍的匹配來過濾它。無論如何,看起來\ w完全匹配unicode字符,並且很高興知道NSPredicate在下面使用相同的正則表達式引擎。 – lawicko
在你鏈接的文章中,我實際上找到了正確的解決方案,因爲NSRegularExpression支持\ X我可以使用它作爲dot(。)的unicode版本,只是使它不貪婪。 – lawicko
好吧我已經改變了答案以反映這一點,謝謝。 –
相反,NSRegularExpression似乎與Unicode字符相匹配 - 至少是我嘗試過的。舉一個例子,你可以看到我的答案。或者,更好的辦法是自己嘗試:-)但有一點需要注意:'\ b'需要'w'標誌(如'(?w:)')來檢測非ASCII字符的字邊界。更多信息在這裏:http://userguide.icu-project.org/strings/regexp – Monolo