【问题标题】:NSRegularExpression string delimited byNSRegularExpression 字符串由
【发布时间】:2011-09-29 06:26:55
【问题描述】:

我有一个字符串,例如@"You've earned Commentator and 4 ##other$$ badges"。我想检索由##$$ 分隔的子字符串@"other"。我做了一个这样的 NSRegularExpression:

NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"##(.*)$$" options:NSRegularExpressionCaseInsensitive error:nil];

这完全忽略了$$ 并返回以## 开头的内容。我究竟做错了什么?谢谢。

【问题讨论】:

    标签: objective-c ios regex cocoa-touch nsregularexpression


    【解决方案1】:

    在这种情况下我不会使用正则表达式,因为字符串攻击是如此简单。无需编译表达式的开销。

    NSString *source = @"You've earned Commentator and 4 ##other$$ badges";
    NSRange firstDelimiterRange = [source rangeOfString:@"##"];
    NSRange secondDelimiterRange = [source rangeOfString:@"$$"];
    NSString *result = [source substringWithRange:
      NSMakeRange(firstDelimiterRange.origin +2, 
        firstDelimiterRange.origin - secondDelimiterRange.origin)];
    

    【讨论】:

    • 不要忽视 NSScanner。我经常使用 NSScanner 创建比使用 NSRange 更好的代码。
    【解决方案2】:

    那是因为'$'是代表行尾的特殊字符。尝试\$\$ 转义它并告诉解析器您想要这些字符。

    【讨论】:

    • 感谢您的回复。我只是这样做了: @"##(.*)\$\$" 。我收到一条警告说未知转义序列,它也不起作用。
    • 哎呀,我自己没有尝试该代码,抱歉。它可能需要对\\$\\$ 进行双重转义,以便解析器看到的最终字符串是\$\$。 :-)
    猜你喜欢
    • 2014-07-01
    • 1970-01-01
    • 2016-07-25
    • 2016-05-21
    • 1970-01-01
    • 2017-10-22
    • 1970-01-01
    • 1970-01-01
    • 2011-12-05
    相关资源
    最近更新 更多