首页 > 解决方案 > iOS NSRegularExpression 文本

问题描述

我有这个文字

1111222233334444

我需要得到这个结果

1111 2222 3333 4444

请给我的公式NSRegularExpression

标签: objective-cformattingnsregularexpression

解决方案


正则表达式模式可能类似于:

^([0-9]{4})([0-9]{4})([0-9]{4})([0-9]{4})$

匹配字符串的^开头,每个都[0-9]{4}找到四个数字的序列,(并且)将这些数字组“捕获”为单独的范围,并且$匹配字符串的结尾。

因此,使用NSRegularExpression,它可能类似于:

- (NSString *)formatCreditCard:(NSString *)string {
    NSError *error;
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"^([0-9]{4})([0-9]{4})([0-9]{4})([0-9]{4})$" options:kNilOptions error:&error];
    if (error) {
        NSLog(@"error: %@", error);
        return nil;
    }

    NSRange range = NSMakeRange(0, string.length);
    NSTextCheckingResult *match = [regex firstMatchInString:string options:kNilOptions range:range];

    if (!match) {
        return nil;
    }

    NSMutableArray <NSString *>*results = [[NSMutableArray alloc] init];
    for (NSInteger index = 1; index <= regex.numberOfCaptureGroups; index++) {
        NSRange range = [match rangeAtIndex:index];
        [results addObject:[string substringWithRange:range]];
    }

    return [results componentsJoinedByString:@" "];
}

NSRegularExpression但如果你不想,你不必进入。您可以使用stringByReplacingOccurrencesOfString:withString:options:range:,NSRegularExpressionSearch选项:

- (NSString *)formatCreditCard:(NSString *)string {
    NSRange range = NSMakeRange(0, string.length);
    return [string stringByReplacingOccurrencesOfString:@"^([0-9]{4})([0-9]{4})([0-9]{4})([0-9]{4})$"
                                             withString:@"$1 $2 $3 $4"
                                                options:NSRegularExpressionSearch
                                                  range:range];
}

FWIW,Swift 版本可能看起来像:

func format(creditCardNumber string: String) -> String? {
    guard
        let regex = try? NSRegularExpression(pattern: "^([0-9]{4})([0-9]{4})([0-9]{4})([0-9]{4})$"),
        let match = regex.firstMatch(in: string, range: NSRange(string.startIndex..., in: string)),
        match.numberOfRanges > 1
    else {
        return nil
    }

    return (1..<match.numberOfRanges)
        .compactMap { Range(match.range(at: $0), in: string) }
        .map { string[$0] }
        .joined(separator: " ")
}

或者

func format(creditCardNumber string: String) -> String {
    string.replacingOccurrences(of: "^([0-9]{4})([0-9]{4})([0-9]{4})([0-9]{4})$",
                                with: "$1 $2 $3 $4",
                                options: .regularExpression)
}

上面,我假设这是您要格式化的信用卡号,但如果是这种情况,请注意这种简单的XXXX XXXX XXXX XXXX格式是不够的。并非所有信用卡号码都采用这种格式(例如美国运通号码是XXXX XXXXXX XXXXX)。

有许多不同的格式和信用卡号长度(请参阅支付卡号)。您可能只想找到一个可以让您摆脱困境的图书馆。有关更多信息,请参阅为信用卡输入格式化 UITextField,例如 (xxxx xxxx xxxx xxxx),或在网络上搜索“iOS 信用卡格式化程序”。


推荐阅读