将非英语字符与\ w匹配

时间:2013-11-04 16:31:30

标签: ios objective-c regex nsregularexpression

我正在尝试从html中提取一些名称。例如,字符串可能如下所示:

Doe, J

我正在使用的模式是:

\w+, \w

只要名字由英文字母组成的字母组成,一切正常。相同的模式与西班牙语或波兰语名称不匹配:

Cortázar, J
Król, S

显然,特定字符存在问题。任何想法如何使\ w匹配这些字符?我调查了NSRegularExpression options,但我不认为它支持它。或者也许我在这里忽略了这一点,我应该提出更聪明的正则表达式?

2 个答案:

答案 0 :(得分: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或各种欧洲重音字符,但它与字符串“Do not Match This”不匹配。

答案 1 :(得分:0)

NSRegularExpression似乎不能很好地匹配unicode字符,你可以做的是将所有内容匹配到分隔符,我认为你有吗?

^(\X+?),$

这将创建一个包含所需结果的捕获组,它也应该与unicode匹配。

您还可以使用匹配的字符表达式\u\p。这可以看作here。这个article描述了它们。