【问题标题】:iOS NSRegularExpression of textiOS NSRegularExpression 文本
【发布时间】:2020-05-23 06:44:34
【问题描述】:

我有这段文字

1111222233334444

我需要得到这个结果

1111 2222 3333 4444

请给我NSRegularExpression的公式。

【问题讨论】:

  • 我建议您尝试一下,或者展示您尝试过的内容。仅仅要求 SO 为您编写代码是不会得到答案的。这里有关于 NSRegularExpression 的文档:developer.apple.com/documentation/foundation/…,你可以使用类似这个网站的东西:regex101.com 来测试你可能的正则表达式

标签: objective-c formatting nsregularexpression


【解决方案1】:

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

^([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)。

有许多不同的格式和信用卡号长度(请参阅Payment card number)。您可能只想找到一个可以让您摆脱困境的图书馆。有关详细信息,请参阅Formatting a UITextField for credit card input like (xxxx xxxx xxxx xxxx) 或在网上搜索“iOS 信用卡格式化程序”。

【讨论】:

    猜你喜欢
    • 2014-04-09
    • 1970-01-01
    • 2012-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-21
    • 2018-04-06
    • 1970-01-01
    相关资源
    最近更新 更多