【问题标题】:Unexpected behavior by [NSRegularExpression stringByReplacingMatchesInString][NSRegularExpression stringByReplacingMatchesInString] 的意外行为
【发布时间】:2012-07-07 15:07:24
【问题描述】:

我今天正在修改 Objective-C,但我遇到了一些奇怪的行为。基本上我试图从 NSString 替换所有非字母小写字符。我基本上归结为:

int main(int argc, const char * argv[])
{

  @autoreleasepool {
    NSError *error;
    NSRegularExpression *pattern = [[NSRegularExpression alloc] initWithPattern:@"/[^abcdefghijklmnopqrstuvwxyz]/" options:0 error:&error];
    NSString *replacableStuff = @"a b c\nd e";
    NSLog(@"%@", [pattern stringByReplacingMatchesInString:replacableStuff options:0 range:NSMakeRange(0, [replacableStuff length]) withTemplate:@""]);

  }
    return 0;
}

但是,替换似乎永远不会发生;运行此日志“a b c\nd e”到日志事物。 (我期待看到“abcde”。)我尝试了更简单的模式,例如/[aeiou]/,甚至只是/a/,但无论我尝试什么,stringByReplacingMatchesInString 方法似乎并没有真正取代任何东西。我忽略了什么?

【问题讨论】:

    标签: objective-c regex cocoa nsregularexpression


    【解决方案1】:

    您需要删除图案两侧的斜线。斜线不是 cocoa 正则表达式中的元字符,因此与您当前表达式匹配的字符串将是两侧带有斜线的单个字母 - /a//b//c/ 等等。

    你也可以在你的角色类中使用一个范围,像这样:

    NSRegularExpression *pattern = [[NSRegularExpression alloc] initWithPattern:@"[^a-z]" options:0 error:&error];
    

    【讨论】:

    • 啊哈!就是这样。当然,现在我觉得在我看过的所有示例中都没有注意到这一点,这让我感到很傻。谢谢!至于范围的事情,我了解到-here on this site,实际上-当涉及到 PHP 的 PCRE 库时,字母范围可以根据系统区域设置匹配不同的字母,所以我已经养成了在可能有的时候把它们写出来的习惯模棱两可。这是我不需要担心 NSRegularExpression 的事情吗?
    • @GarrettAlbright 关于范围取决于编码,这是一个很好的观点。但是,在运行 Objective C 程序的环境(macs 和 ios 设备)中,您遇到非正统编码的可能性为零,其中拉丁字母的字母没有排列在连续的块中。
    猜你喜欢
    • 1970-01-01
    • 2011-09-23
    • 2020-10-04
    • 2016-07-16
    • 2016-05-10
    • 2020-07-23
    • 2021-08-23
    • 2021-11-16
    • 2017-10-20
    相关资源
    最近更新 更多