正则表达式用于带和不带特殊字符的字符串比较

时间:2018-12-03 12:37:17

标签: ios objective-c regex nsregularexpression

我正在尝试创建用于字符串比较的正则表达式。 正则表达式为:.*\bword.*

但是,我想忽略特殊字符,使用和不使用特殊字符都可以进行比较。

例如:

O'Reilly应该与O'Reilly和oreilly匹配

是否可以使用正则表达式?

P.S。

这将在带有NSPredicate的iOS中使用。 当前,谓词​​如下:

NSString *regexString = [NSString stringWithFormat:@".*\b%@.*", word];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K matches[cd] %@", keypath, regexString];

由于NSPredicate不允许我执行任何操作,例如将键路径的值替换为没有特殊字符的值,因此我需要通过正则表达式来完成。

1 个答案:

答案 0 :(得分:1)

您可能会考虑在进行比赛之前对字符串进行预处理。如果您有一个可接受的字符列表,在您的示例中只是a-z和A-Z,则可以使用音译运算符tr///删除所有其他字符,并使用lc来小写该字符串。 tr上的标志是c,表示匹配,即匹配未列出的所有内容,d删除没有替换项的所有匹配项,因为替换项为空,表示所有内容匹配。

$string =~ tr/a-zA-Z//cd;
$string = lc $string;

如果您使用的字符不在ASCII范围内,则需要更聪明。

$string =~ s/\P{L}+//g;
$string = fc $string;

首先,我们使用正则表达式删除所有不在常规类别字母中的Unicode字符。然后,我们使用fc函数折叠字符串的大小写,这与Perl用于区分大小写的正则表达式匹配的函数相同。请注意,您可能要先对字符串进行规范化。