Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/107.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 将非英语字符与\w匹配_Ios_Objective C_Regex_Nsregularexpression - Fatal编程技术网

Ios 将非英语字符与\w匹配

Ios 将非英语字符与\w匹配,ios,objective-c,regex,nsregularexpression,Ios,Objective C,Regex,Nsregularexpression,我正在尝试从html中提取一些名称。例如,字符串可能如下所示: Doe, J 我使用的模式是: \w+, \w 只要名字由英文字母组成,一切都很好。相同的图案与西班牙语或波兰语名称不匹配: Cortázar, J Król, S 显然,具体的角色是有问题的。您知道如何匹配这些字符吗?我调查了这个问题,但我认为它不支持它。或者我没有抓住要点,我应该想出更聪明的正则表达式?NSRegularExpression似乎无法很好地匹配unicode字符,您可以做的是将所有内容匹配到一个分隔符,我假设

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

Doe, J
我使用的模式是:

\w+, \w
只要名字由英文字母组成,一切都很好。相同的图案与西班牙语或波兰语名称不匹配:

Cortázar, J
Król, S

显然,具体的角色是有问题的。您知道如何匹配这些字符吗?我调查了这个问题,但我认为它不支持它。或者我没有抓住要点,我应该想出更聪明的正则表达式?

NSRegularExpression
似乎无法很好地匹配unicode字符,您可以做的是将所有内容匹配到一个分隔符,我假设您有

^(\X+?),$
这将创建一个包含您想要的结果的捕获组,并且它还应该与unicode匹配


您还可以使用匹配的字符表达式
\u
\p
。这是可以看到的。这就描述了它们。

NSRegularExpression
似乎无法很好地匹配unicode字符,您可以做的是将所有字符匹配到一个分隔符,我想您有

^(\X+?),$
这将创建一个包含您想要的结果的捕获组,并且它还应该与unicode匹配


您还可以使用匹配的字符表达式
\u
\p
。这是可以看到的。这就描述了它们。

使用
\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
的问题之一是需要将其放入一个字符串中,并正确转义所有反斜杠

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字符,也可以是各种欧洲重音字符,但与字符串“dot match This”不匹配。

在您链接的文章中,我实际上找到了正确的解决方案,因为NSRegularExpression支持\X我可以将其用作点(.)的unicode版本,不要贪心。
NSRegularExpression
相反,似乎与Unicode字符匹配得很好-至少是我尝试过的那些字符。举个例子,你可以看到我的答案。或者,更好的是,你自己试试:-)有一件事需要注意:
\b
需要
w
标志(如
(?w:)
来检测非ASCII字符的单词边界。更多信息如下:@Monolo,同意。这是因为
\w
在iOS()。在您链接的文章中,我实际上找到了正确的解决方案,因为NSRegularExpression支持\X我可以将其用作点(.)的unicode版本,不要贪心。
NSRegularExpression
相反,似乎与Unicode字符匹配得很好-至少是我尝试过的那些字符。例如,你可以看到我的答案。或者,更好的是,自己试试:-)但是有一点需要注意:
\b
需要
w
标志(如
(?w:)
检测带有非ASCII字符的单词边界。此处的更多信息:@Monolo,同意。这是因为
\w
在iOS()上被定义为
[\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}]
。我不确定这与我的问题有什么关系,我能做些什么使名称与NSRegularExpression匹配吗?@lawicko我希望这与你的问题有很大关系-谓词引擎只是一种简单的方法,用于快速验证概念。我重新编写了该示例,以避免在格式中使用文学正则表达式模式字符串,因此这两个示例现在可以直接比较。无论如何,编辑了答案,添加了一个使用
NSRegularExpression
完成的示例。只需要更多的代码就可以证明它是有效的。这一定很神奇:)我昨天尝试的相同匹配现在神奇地起作用了,我不知道为什么:)感谢您的解释,实际上,我不再使用\w了,因为我发现我的数据有时带有复合名称,所以我使用更通用的匹配来过滤它。无论如何,它看起来\w毕竟与unicode字符匹配,而且很高兴知道NSPredicate下面使用相同的正则表达式引擎。我不确定这与我的问题有什么关系,我能做些什么使名称与NSRegularExpression匹配吗?@lawicko这与你的问题有很大关系,我希望-谓词引擎只是一种更简单的方法,用于快速证明概念。我重新编写了这个示例,在格式字符串中不使用文学正则表达式模式,因此这两个示例现在可以直接比较。无论如何,请编辑答案以添加使用
NSRegularExpression
完成的示例。只需要更多的代码就可以证明它是有效的。这一定很神奇:)我昨天尝试过的匹配现在神奇地起作用了,我不知道为什么:)谢谢你的解释,我实际上已经不再使用\w了,因为我发现我的数据有时带有复合名称,所以我使用更通用的匹配来过滤它。无论如何,它看起来\w与