Ben*_*ris 157 objective-c nsstring
我有一个带有一些括号和连字符的NSString(电话号码),因为某些电话号码已格式化.如何从字符串中删除除数字之外的所有字符?
sim*_*obo 374
老问题,但怎么样:
NSString *newString = [[origString componentsSeparatedByCharactersInSet:
[[NSCharacterSet decimalDigitCharacterSet] invertedSet]]
componentsJoinedByString:@""];
Run Code Online (Sandbox Code Playgroud)
它会爆炸非数字集上的源字符串,然后使用空字符串分隔符重新组合它们.不如通过字符选择那么高效,但在代码中更紧凑.
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
,所以你可能想看一下.
Yac*_*ali 63
接受的答案对于所要求的内容来说是过度的.这更简单:
NSString *pureNumbers = [[phoneNumberString componentsSeparatedByCharactersInSet:[[NSCharacterSet decimalDigitCharacterSet] invertedSet]] componentsJoinedByString:@""];
Run Code Online (Sandbox Code Playgroud)
小智 30
这很棒,但代码在iPhone 3.0 SDK上对我不起作用.
如果我在这里显示我定义了strippedString,我会BAD ACCESS error
在scanCharactersFromSet: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)
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作为常见的国际电话号码格式.
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)
归档时间: |
|
查看次数: |
76413 次 |
最近记录: |