从NSString中删除所有非数字字符,保留空格。

18

我想要从一个NSString中删除所有非数字字符,但我也需要保留空格。这是我一直在使用的代码。

NSString *strippedBbox = [_bbox stringByReplacingOccurrencesOfString:@"[^0-9]" withString:@"" options:NSRegularExpressionSearch range:NSMakeRange(0, [_bbox length])];
如果我给它一个NSString,其中包含Test 333 9599 999,它将返回3339599999,但我需要保留空格。
我该如何做?

2
迭代字符,检查是否为空格或数字,如果是,则将其附加到另一个字符串。 - user529758
替换字符串不应该是一个空字符串,而应该是一个空格吧? - Merlevede
1
将空格添加到字符类中... - Kevin
7个回答

32
很容易通过创建一个包含你想保留字符的字符集,并使用invertedSet来创建一个“所有其他字符”的字符集。然后将字符串按此字符集中的任何字符分割成数组,再重新组合字符串即可。听起来很复杂,但实现起来非常简单:
NSCharacterSet *setToRemove =   
    [NSCharacterSet characterSetWithCharactersInString:@"0123456789 "];
NSCharacterSet *setToKeep = [setToRemove invertedSet];

NSString *newString = 
        [[someString componentsSeparatedByCharactersInSet:setToKeep]
            componentsJoinedByString:@""];

结果:333 9599 99


这假设使用英文数字字符;如何轻松地调整为区域感知? - WDUK
6
创建一个可变副本[NSCharacterSet decimalDigitCharacterSet],并在其中添加一个空格。 - dreamlax
使用更简洁、更短的代码更新。 - memmons
@dreamlax 这种情况下只需指定数字的代码稍微少一些。如果集合是字母或字母数字,则使用可变集合更为可取。 - memmons
1
@MichaelG.Emmons:我是在回答WDUK的问题,decimalDigitCharacterSet 包括其他语言中的十进制数字字符,例如印度和阿拉伯文字。 - dreamlax

21
你可以修改第一个正则表达式,在数字 9 后面添加一个空格:
在 Swift 中:
var str = "test Test 333 9599 999";
val strippedStr = str.stringByReplacingOccurrencesOfString("[^0-9 ]", withString: "", options: NSStringCompareOptions.RegularExpressionSearch, range:nil);
// strippedStr = " 33 9599 999"

虽然这会保留前导空格,但您可以应用空格修剪来处理它:

strippedStr.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceCharacterSet())
// strippedStr = "33 9599 999"

4
// Our test string
NSString* _bbox = @"Test 333 9599 999";

// Remove everything except numeric digits and spaces
NSString *strippedBbox = [_bbox stringByReplacingOccurrencesOfString:@"[^\\d ]" withString:@"" options:NSRegularExpressionSearch range:NSMakeRange(0, [_bbox length])];
// (Optional) Trim spaces on either end, but keep spaces in the middle
strippedBbox = [strippedBbox stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];

// Print result
NSLog(@"%@", strippedBbox);

这将打印出333 9599 999,我认为这正是您想要的。它还会删除字符串中可能存在的非数字字符,例如括号。


啊,哎呀,抱歉。我没看到那个。 - Léo Natan

4

针对Swift 3.0.1用户

var str = "1 3 6 .599.188-99 "
    str.replacingOccurrences(of: "[^0-9]", with: "", options: .regularExpression, range: nil)

输出:"13659918899"

同时也会清除字符串中的空格


3

尝试使用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"

这会删除空格,但OP想要保留它们。 - Michał Ciuba
@MichałCiuba,好了,我修好了。 - Léo Natan
NSString 提供方便的方法来减少所需的代码行数时,这也相当强硬。 - WDUK
缺少缩进让我感到非常烦恼,我也不得不修复它。 - dreamlax

0
NSMutableString strippedBbox = [_bbox mutableCopy];
NSCharacterSet* charSet = [NSCharacterSet characterSetWithCharactersInString:@"1234567890 "].invertedSet;

NSUInteger start = 0;
NSUInteger length = _bbox.length;

while(length > 0)
{
    NSRange range = [strippedBbox rangeOfCharacterFromSet:charSet options:0 range:NSMakeRange(start, length)];

    if(range.location == NSNotFound)
    {
        break;
    }

    start += (range.location + range.length);
    length -= range.length;

    [strippedBbox replaceCharactersInRange:range withString:@""];
}

0
简言之,您可以使用NSCharacterSet来仅检查您感兴趣的字符并忽略其余部分。
- (void) stripper {

    NSString *inString = @"A1 B2 C3 D4";
    NSString *outString = @"";

    for (int i = 0; i < inString.length; i++) {

        if ([[NSCharacterSet whitespaceCharacterSet] characterIsMember:[inString characterAtIndex:i]] || [[NSCharacterSet decimalDigitCharacterSet] characterIsMember:[inString characterAtIndex:i]]) {

            outString = [outString stringByAppendingString:[NSString stringWithFormat:@"%c",[inString characterAtIndex:i]]];
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接