从NSString中删除所有数字

Ben*_*ris 157 objective-c nsstring

我有一个带有一些括号和连字符的NSString(电话号码),因为某些电话号码已格式化.如何从字符串中删除除数字之外的所有字符?

sim*_*obo 374

老问题,但怎么样:

  NSString *newString = [[origString componentsSeparatedByCharactersInSet:
                [[NSCharacterSet decimalDigitCharacterSet] invertedSet]] 
                componentsJoinedByString:@""];
Run Code Online (Sandbox Code Playgroud)

它会爆炸非数字集上的源字符串,然后使用空字符串分隔符重新组合它们.不如通过字符选择那么高效,但在代码中更紧凑.

  • 谢谢!对于其他初学者,您可以通过执行`NSCharacterSet*myCharSet = [NSCharacterSet characterSetWithCharactersInString:@"charactersGoHere"]来创建自己的自定义NSCharacterSet. (6认同)

Nat*_*ies 75

没有必要使用正则表达式库,因为其他答案建议 - 你所追求的类被调用NSScanner.它的用法如下:

NSString *originalString = @"(123) 123123 abc";
NSMutableString *strippedString = [NSMutableString 
        stringWithCapacity:originalString.length];

NSScanner *scanner = [NSScanner scannerWithString:originalString];
NSCharacterSet *numbers = [NSCharacterSet 
        characterSetWithCharactersInString:@"0123456789"];

while ([scanner isAtEnd] == NO) {
  NSString *buffer;
  if ([scanner scanCharactersFromSet:numbers intoString:&buffer]) {
    [strippedString appendString:buffer];

  } else {
    [scanner setScanLocation:([scanner scanLocation] + 1)];
  }
}

NSLog(@"%@", strippedString); // "123123123"
Run Code Online (Sandbox Code Playgroud)

编辑:我已经更新了代码,因为原件是我的头顶写的,我认为这足以指出人们正确的方向.似乎人们在代码之后可以直接复制粘贴到他们的应用程序中.

我也同意Michael Pelz-Sherman的解决方案比使用更合适NSScanner,所以你可能想看一下.

  • 知道NSCharacterSet的+ decimalDigitCharacterSet方法可以为您提供所有小数位数,这可能很方便.这与集合Nathan列表略有不同,因为它包括表示十进制数字的所有符号,包括例如阿拉伯语 - 印度数字(12345等).根据您的应用程序,这可能偶尔会出现问题,但通常是好的或中性的,而且输入要短一些. (4认同)
  • 这太复杂了. (4认同)

Yac*_*ali 63

接受的答案对于所要求的内容来说是过度的.这更简单:

NSString *pureNumbers = [[phoneNumberString componentsSeparatedByCharactersInSet:[[NSCharacterSet decimalDigitCharacterSet] invertedSet]] componentsJoinedByString:@""];
Run Code Online (Sandbox Code Playgroud)

  • (当前)接受的答案或多或少与此相同,但是在13个月之前发布. (2认同)

小智 30

这很棒,但代码在iPhone 3.0 SDK上对我不起作用.

如果我在这里显示我定义了strippedString,我会BAD ACCESS errorscanCharactersFromSet:intoString调用后尝试打印它时得到一个.

如果我这样做:

NSMutableString *strippedString = [NSMutableString stringWithCapacity:10];
Run Code Online (Sandbox Code Playgroud)

我最终得到一个空字符串,但代码不会崩溃.

我不得不求助于旧的C:

for (int i=0; i<[phoneNumber length]; i++) {
    if (isdigit([phoneNumber characterAtIndex:i])) {
        [strippedString appendFormat:@"%c",[phoneNumber characterAtIndex:i]];
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,电话号码应为"+"字符. (2认同)

ale*_*lex 27

虽然这是一个有问题的老问题,但我错过了国际格式支持.基于simonobo的解决方案,改变的字符集包括加号"+".此修订也支持国际电话号码.

NSString *condensedPhoneNumber = [[phoneNumber componentsSeparatedByCharactersInSet:
              [[NSCharacterSet characterSetWithCharactersInString:@"+0123456789"]
              invertedSet]] 
              componentsJoinedByString:@""];
Run Code Online (Sandbox Code Playgroud)

Swift表达式是

var phoneNumber = " +1 (234) 567-1000 "
var allowedCharactersSet = NSMutableCharacterSet.decimalDigitCharacterSet()
allowedCharactersSet.addCharactersInString("+")
var condensedPhoneNumber = phoneNumber.componentsSeparatedByCharactersInSet(allowedCharactersSet.invertedSet).joinWithSeparator("")
Run Code Online (Sandbox Code Playgroud)

其中产生+12345671000作为常见的国际电话号码格式.

  • 这是列表中的最佳解决方案,特别是如果您需要国际电话号码的加号. (2认同)

Chr*_*ley 11

这是Swift版本.

import UIKit
import Foundation
var phoneNumber = " 1 (888) 555-5551    "
var strippedPhoneNumber = "".join(phoneNumber.componentsSeparatedByCharactersInSet(NSCharacterSet.decimalDigitCharacterSet().invertedSet))
Run Code Online (Sandbox Code Playgroud)


Jon*_*gel 11

Swift版最流行的答案:

var newString = join("", oldString.componentsSeparatedByCharactersInSet(NSCharacterSet.decimalDigitCharacterSet().invertedSet))
Run Code Online (Sandbox Code Playgroud)

编辑:Swift 2的语法

let newString = oldString.componentsSeparatedByCharactersInSet(NSCharacterSet.decimalDigitCharacterSet().invertedSet).joinWithSeparator("")
Run Code Online (Sandbox Code Playgroud)

编辑:Swift 3的语法

let newString = oldString.components(separatedBy: CharacterSet.decimalDigits.inverted).joined(separator: "")
Run Code Online (Sandbox Code Playgroud)


小智 5

谢谢你的例子.如果在数字CharacterSet对象中找不到originalString中的一个字符,则只有一件事缺少scanLocation的增量.我添加了一个else {}语句来解决这个问题.

NSString *originalString = @"(123) 123123 abc";
NSMutableString *strippedString = [NSMutableString 
        stringWithCapacity:originalString.length];

NSScanner *scanner = [NSScanner scannerWithString:originalString];
NSCharacterSet *numbers = [NSCharacterSet 
        characterSetWithCharactersInString:@"0123456789"];

while ([scanner isAtEnd] == NO) {
  NSString *buffer;
  if ([scanner scanCharactersFromSet:numbers intoString:&buffer]) {
    [strippedString appendString:buffer];
  }
  // --------- Add the following to get out of endless loop
  else {
     [scanner setScanLocation:([scanner scanLocation] + 1)];
  }    
  // --------- End of addition
}

NSLog(@"%@", strippedString); // "123123123"
Run Code Online (Sandbox Code Playgroud)