objective-c - iOS NSRegularExpression 文本
问题描述
我有这个文字
1111222233334444
我需要得到这个结果
1111 2222 3333 4444
请给我的公式NSRegularExpression
。
解决方案
正则表达式模式可能类似于:
^([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 信用卡格式化程序”。
推荐阅读
- mongodb - 使用 $graphLookup 使用 Mongo 进行分层查询
- android - 如何从 javascript 中的 WebView 获取我的 Android / iOS 应用程序的权限?
- grails - 在上下文验证期间,池化的 LdapTemplate 会停滞几分钟
- javascript - Polymer 3 插槽后备内容总是被渲染,无论它是否在宿主元素中被覆盖
- univocity - 使用 Univocity Parser 验证解析的字段
- mysql - MySQL 错误 1111 - 嵌套窗口函数时组函数的使用无效
- javascript - 如何在多个 div 类中添加脚本
- machine-learning - 是否可以在 Google Dataprep 中拆分数据集?如果是这样,怎么做?
- c++ - 使用 constexpr 替换 #define 和 #ifdef 进行条件编译
- python - 使 CSV 转义双引号