我正在尝试从 html 中提取一些名称。例如,字符串可能如下所示:
Doe, J
我使用的模式是:
\w+, \w
只要名称由英文字母组成,一切正常。相同的模式与西班牙语或波兰语名称不匹配:
Cortázar, J
Król, S
显然,具体的字符是有问题的。有什么想法可以使 \w 匹配这些字符吗?我查看了NSRegularExpression options,但我认为它不支持它。或者也许我错过了这里的重点,我应该想出更聪明的正则表达式?
我正在尝试从 html 中提取一些名称。例如,字符串可能如下所示:
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 处遗漏了“错误”字符串。
这表明您可以将字符串与 an 匹配, NSRegularExpression
因为谓词引擎使用相同的正则表达式语法。
编辑添加:
如果您坚持NSRegularExpression
直接使用 an,那么您可以使用更多代码看到它:
// 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 还是各种欧洲重音字符,但它与字符串“Don't Match This”不匹配。