正则表达式模式可能类似于:
^([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 信用卡格式化程序”。