0

我编写了以下代码以消除 3 个点之后的任何内容

currentItem.summary = @"I am just testing. I am ... the second part should be eliminated";
NSError * error = NULL;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(.)*(/././.)(.)*" options:0  error:&error];

if(nil != regex){
    currentItem.summary = [regex stringByReplacingMatchesInString:currentItem.summary
                               options:0  range:NSMakeRange(0, [currentItem.summary length])
                                               withTemplate:@"$1"];
}

但是,我的输入和输出是一样的。正确的输出应该是“我只是在测试。我是”。

我试图使用正则表达式来做到这一点,因为我有一个在字符串上运行的其他正则表达式的数据库。我知道性能可能不如纯文本查找或替换,但所涉及的字符串很短。我还尝试使用“\”来转义正则表达式中的点,但我收到了警告。

还有一个类似主题的问题,但匹配字符串不适用于目标 c。

4

5 回答 5

4

这更容易,并将完成您想要的:

NSRange range = [currentItem.summary rangeOfString:@"..."];
if (range != NSNotFound) {
    currentItem.summary = [currentItem.summary substringToIndex:range.location];
}
于 2012-07-05T18:51:48.563 回答
3

您的模式中有正斜杠 ,/而不是反斜杠 , \。此外,如果您希望匹配三个点之前的所有内容,您应该使用(.*)- 标记所有匹配的内容.*。(模式中的其他括号是多余的。)

于 2012-07-05T18:46:31.043 回答
2

不错的选择:

NSScanner *scanner = [NSScanner scannerWithString:currentItem.summary];   
[scanner scanUpToString:@"..." intoString: &currentItem.summary];
于 2012-07-05T18:53:38.030 回答
1

我为您的问题推荐的正则表达式:

regularExpressionWithPattern:@"^(.*)\\s*\\.{3}.*$"

这个和你的主要区别:

  • 使用反斜杠转义特殊字符
  • 使用^and$锚定在字符串的开头和结尾
  • 仅捕获有趣的部分()
  • ...通过忽略任意数量的空白字符 ( \s*)去除 之前的空白。
于 2012-07-05T19:23:18.877 回答
0

在更正斜线和其他改进之后,我的最终表达是:

NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"^(.*)\\.{3}.*$" 
                                                                                options:0 
                                                                                error:&error];
于 2012-07-05T19:48:34.837 回答