NSpredicate 上的正则表达式未按预期工作

Posted

技术标签:

【中文标题】NSpredicate 上的正则表达式未按预期工作【英文标题】:Regex on NSpredicate not working as expected 【发布时间】:2014-04-08 11:37:52 【问题描述】:

实际上,我在尝试将正则表达式用于 NSpredicate 时完全迷失了方向。 我想要的是一个正则表达式,它可以在句子中找到符合条件的所有单词的开头。事实是这样行不通。

这是我的正则表达式:.*\b xxx [\w-]*(其中 xxx 是我的标准)。

这是代码

   NSString* regexString   = [NSString stringWithFormat: @".*\\b%@[\\w-]*", search];
   request.predicate       = [NSPredicate predicateWithFormat:@"adresse matches[cd] %@", regexString];

地址是我的核心数据对象的字符串属性。但由于一些模糊的原因,这是行不通的。有人可以帮我吗?

例如: 城市三明治 67200 斯特拉斯堡

.*\bStra[\w-]* 会找到斯特拉斯堡

.*\b672[\w-]*.*\bSAND[\w-]* 不会产生任何结果。

编辑

我终于放弃了,改写了(adresse BEGINSWITH[c] %@) OR (adresse CONTAINS[c] %@) 语句,其中 %@ 是搜索词。

但是如果有人能解释一下为什么 obj-c 中的简单正则表达式看起来像是在太空中发射火箭,那么这个话题仍然是开放的。奇怪的是,正则表达式确实有效,但它应该是一半,就像没有严格遵守规则一样。我现在真的很困惑。

【问题讨论】:

你好,你的模式对我来说似乎有点奇怪(我对正则表达式很陌生)但为什么你最后有一个-?你期待你的字符串中有任何- 吗? 事实上,当我在网站上发送正则表达式时,它工作正常。我什至在 Java 代码上编写了 \b[\w] 正则表达式,它运行良好。但在 ios 上,我不知道为什么,这根本不起作用。所以我实际上迷路了,并在开头使用了额外的规则,如 .* 和 * 在结尾,或者正则表达式根本不起作用 我发布了一个 anwser,使用的方法与 java 的方法非常相似;) 【参考方案1】:

我没有使用与您相同的对象,而是使用另一个我更了解并且看起来更像 Java 的对象;)

NSString* string = @"CITY SANDWITCH 67200 STRASBOURG";
NSString* search = @"SAND"; // work also with 672 or STRAS
NSString* regexString  = [NSString stringWithFormat: @".*\\b(%@[\\w]*)[\\s*\\w*]*", search];
NSError  *error  = NULL;

NSRegularExpression *regex = [NSRegularExpression
                              regularExpressionWithPattern:regexString
                              options:0
                              error:&error];

NSString *modifiedString = [regex stringByReplacingMatchesInString:string options:0 range:NSMakeRange(0, [string length]) withTemplate:@"$1"];

NSLog(@"-->%@", modifiedString);

【讨论】:

OP 似乎想使用NSPredicate 并且还想搜索“Sand”,而不是“SAND”。 是的,我看到了,但我更愿意给出一个有效的答案,即使它不在 NSPredicate 中:) 我对 NSPredicate 不太了解,所以我让其他答案;) 好的,谢谢大家的解决方案。 Clad Clad 和@Akhilrajtr 解决方案都可以正常工作。我不明白在哪里可以找到这些正则表达式的正确文档,因为它们似乎没有遵循相同的规则。但是当我阅读 tuto 时,他们说的好像所有的正则表达式都是完全标准的。 就我个人而言:developer.apple.com/library/ios/documentation/Foundation/… 和 vogella.com/tutorials/JavaRegularExpressions/article.html 是非常好的文档(对于 IOS 第一个链接/Java 第二个链接)【参考方案2】:

尝试将regexString 更改为

NSString* regexString   = [NSString stringWithFormat: @".*\\b%@.*", search];

【讨论】:

以上是关于NSpredicate 上的正则表达式未按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

LDAP olcAccess 正则表达式未按预期工作

使用正则表达式查找命令未按预期工作

Grep 正则表达式未按预期工作

NLTK - nltk.tokenize.RegexpTokenizer - 正则表达式未按预期工作

js 正则表达式未按预期工作。未检测到换行符[重复]

C++ 11 正则表达式未按预期返回组