【问题标题】:iphone sdk - Remove all characters except for numbers 0-9 from a string [duplicate]iphone sdk - 从字符串中删除除数字0-9之外的所有字符[重复]
【发布时间】:2010-11-12 17:21:03
【问题描述】:

好的,这就是计划。我从中获取数据的 XML 允许在电话号码字段中使用非数字文本(用于描述或联系人姓名等)。我正在尝试仅提取数字并与他们一起拨打电话:URL 以发起呼叫。以下是不起作用的:

NSCharacterSet *charset = [[NSCharacterSet decimalDigitCharacterSet] invertedSet];
NSString *number = @"(555) 555-5555 Office";
NSString *strippedNumber = [number stringByTrimmingCharactersInSet:charset];
NSString *phoneURL = [NSString stringWithFormat:@"tel:%@", strippedNumber];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:phoneURL]];

如果有任何明显的拼写错误,它们只是拼写错误。 :)

【问题讨论】:

    标签: iphone nsstring


    【解决方案1】:

    仅使用 iOS API 更简单:

    NSString * number = @"(555) 555-555 Office";
    NSString * strippedNumber = [number stringByReplacingOccurrencesOfString:@"[^0-9]" withString:@"" options:NSRegularExpressionSearch range:NSMakeRange(0, [number length])];
    

    【讨论】:

      【解决方案2】:

      虽然这已经被回答/接受,但我有一个更好的解决方案,不需要外部 SDK。在这样的类别中创建一个额外的 NSString 方法:

      @interface NSString (Helpers)
      
      - (NSString*)stringByRemovingCharactersInSet:(NSCharacterSet*)set;
      
      @end
      
      @implementation NSString (Helpers)
      
      - (NSString*)stringByRemovingCharactersInSet:(NSCharacterSet*)set
      {
          NSArray* components = [self componentsSeparatedByCharactersInSet:set];
          return [components componentsJoinedByString:@""];
      }
      
      @end
      

      现在您可以使用 stringByRemovingCharactersInSet 代替 stringByTrimmingCharactersInSet。不过,我还建议对您的示例代码稍作改动,以支持国际号码中的“+”字符,如下所示:

      NSString* number = @"(555) 555-555 Office";
      NSCharacterSet* phoneChars = [NSCharacterSet characterSetWithCharactersInString:@"+0123456789"];
      NSString* strippedNumber = [number stringByRemovingCharactersInSet:[phoneChars invertedSet]];
      NSString* urlString = [NSString stringWithFormat:@"tel:%@", strippedNumber];
      [[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlString]];
      

      【讨论】:

        【解决方案3】:

        您正在使用修剪方法,这意味着它只查看字符串的外边缘。您可能会得到类似:“555) 555-555”作为电话号码,对吗?

        我不知道类似“replaceOccurrencesOfCharactersInSet:(NSCharacterSet *)set”的 NS(Mutable)String 方法,我承认,如果有这样的方法可能真的很棒。

        作为我,我可能只会使用正则表达式。如果你使用RegexKitLite,那么你可以轻松做到:

        #import "RegexKitLite.h"
        
        NSString * number = @"(555) 555-555 Office";
        NSString * strippedNumber = [number stringByReplacingOccurrencesOfRegex:@"[^0-9]" withString:@""];
        

        这可能有点矫枉过正,但它会完全符合您的要求。

        仅供参考:“[^0-9]”表示“任何不是 0、1、2、3、4、5、6、7、8 或 9 的字符”。

        【讨论】:

        • RegexKitLite 对于 ARC 和 iOS 6 来说有点过时了。请查看我的回答,看看没有这个库也能工作的方法。
        猜你喜欢
        • 2011-04-25
        • 2012-11-03
        • 2012-12-10
        • 2011-06-23
        • 1970-01-01
        • 2014-03-26
        • 2014-11-08
        • 1970-01-01
        • 2017-04-05
        相关资源
        最近更新 更多