CoreData NSPredicate MATCHES 正则表达式

Posted

技术标签:

【中文标题】CoreData NSPredicate MATCHES 正则表达式【英文标题】:CoreData NSPredicate MATCHES regex 【发布时间】:2020-05-16 21:10:23 【问题描述】:

我有一个 CoreData 表,其中一个字段包含一系列用逗号分隔的数字字符串。我希望能够使用与给定特定数字匹配的谓词运行提取。

例如,如果 fieldName = "12,52,66,89,2,8"

我想搜索 2,那么它应该匹配字符串中倒数第二个数字并将该记录包含在结果中。

使用正则表达式: ^2|,2,|,2 我发现它在我的测试用例中工作得令人满意,例如使用此站点对其进行测试:https://www.regexpal.com/

但是,当我将它传递给 NSFetchRequest 的 NSPredicate 时,我无法让它匹配

NSNumber *val = @2;
NSString *regex = [NSString stringWithFormat:@"^%@|,%@,|,%@", val, val, val];
NSPredicate *pred = [NSPredicate predicateWithFormat:@"fieldName MATCHES %@", regex];

用 CONTAINS val 替换 MATCHES 可以使其工作,但当然它也会错误地匹配任何出现的数字。

我怀疑我在格式化 CoreData(或正则表达式)时遗漏了一些愚蠢的东西,但我尝试了很多变体,我希望善良的灵魂阅读这篇文章会让我摆脱痛苦:)

【问题讨论】:

"12,52,66,89,2,8",你只匹配,2,你的正则表达式需要匹配整个字符串。否则,它在搜索中返回不匹配。 感谢@Larme,现在已解决,请参阅下面接受的答案中的我的 cmets。最后我遇到了两个错误 - 1. 认为任何匹配都会算作 fetchrequest 谓词的匹配,以及 2. 没有转义转义字符。 【参考方案1】:

免责声明:我没有使用过 Objective C。这个答案基于我的正则表达式知识和some documentation。

比赛 根据 ICU v3,左侧表达式使用正则表达式样式比较等于右侧表达式(有关更多详细信息,请参阅 ICU 正则表达式用户指南)。

这听起来像是 Java 使用“matches”方法的方式,在这种情况下,“^2|,2,|,2”永远无法匹配整个字符串。这与总是搜索文本的正则表达式不同。您需要的正则表达式更像

.*\b2\b.*

(在 Java 中假定 ^$)。另一种选择是拆分字符串。

【讨论】:

感谢您,您可能是正确的,它需要在整个字符串上进行匹配而不是找到任何匹配项,我会进一步调查! (你的例子也不能正常工作,虽然它看起来应该,我想知道这个词边界定义是否是原因)。 我正在做更多的测试,但我相信这已经导致了解决方案 - 另一个问题是正则表达式反斜杠需要转义。我现在正在使用 NSString regex = [NSString stringWithFormat:@".*\\b%@\\b.", val]; 进行测试

以上是关于CoreData NSPredicate MATCHES 正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

CoreData 和 NSPredicate

NSPredicate 中的 SQL ORDER BY 等价物 - CoreData

CoreData NSPredicate

CoreData 获取请求 NSPredicate 不起作用

NSPredicate,CoreData 中的空格。如何修剪谓词?

具有 NSPredicate 和 OR 条件的 CoreData