如何在Objective-C中用NSRegularExpression检测并提取二维码字符串的Order Id
如何在Objective-C中提取二维码字符串里的完整Order Id条目
我看了你遇到的问题——原来的正则只能匹配到Order Id :-这个标签,拿不到后面的订单ID值对吧?这是因为你的正则没有包含对值部分的匹配逻辑,我们只需要调整正则表达式,就能同时捕获标签和对应的值了。
问题分析
你的目标字符串格式是:
Address : Event :- seminar,Date & Time:- Apr 04 2018 - 2:03 PM / Aug 17 2018 - 1:00 AM ,Order Id :- 201807,Event location :- Pune, Maharashtra, India
Order Id的条目是Order Id :- 201807,后面跟着逗号作为分隔符,所以我们可以利用这个分隔符来界定值的范围。
解决方案
修改正则表达式,让它既能匹配标签,又能捕获到后面的订单ID值,同时还能获取完整的条目。
调整后的正则表达式
Order Id :-\\s*([^,]+)
这个正则的含义:
Order Id :-:匹配固定的标签文本\\s*:匹配0个或多个空白字符(兼容标签和值之间可能的空格)([^,]+):捕获组,匹配任意数量的非逗号字符(因为订单ID的下一个分隔符是逗号,这样就能精准拿到从标签后到逗号前的所有内容)
修改后的完整代码
if ([barcode.getBarcodeType isEqualToString:@"org.iso.QRCode"]) { NSLog(@"Address : %@",[barcode getBarcodeData]); NSString *searchedString = [barcode getBarcodeData]; // 可选:解码HTML实体(比如把&转换成&,让字符串更准确) NSString *htmlString = [NSString stringWithFormat:@"<html><body>%@</body></html>", searchedString]; NSAttributedString *attributedString = [[NSAttributedString alloc] initWithData:[htmlString dataUsingEncoding:NSUTF8StringEncoding] options:@{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute: @(NSUTF8StringEncoding)} documentAttributes:nil error:nil]; NSString *stringFromFile = [attributedString string]; // 初始化调整后的正则 NSString *pattern = @"Order Id :-\\s*([^,]+)"; NSRegularExpression *regex = [[NSRegularExpression alloc] initWithPattern:pattern options:0 error:nil]; NSArray *matches = [regex matchesInString:stringFromFile options:0 range:NSMakeRange(0, [stringFromFile length])]; if (matches.count > 0) { for (NSTextCheckingResult *match in matches) { // 获取完整的Order Id条目(比如"Order Id :- 201807") NSString *fullOrderIdEntry = [stringFromFile substringWithRange:[match range]]; NSLog(@"完整Order Id条目:%@\n", fullOrderIdEntry); // 获取单独的Order Id值(比如"201807") if ([match numberOfRanges] > 1) { NSString *orderIdValue = [stringFromFile substringWithRange:[match rangeAtIndex:1]]; NSLog(@"Order Id值:%@\n", orderIdValue); } } } else { NSLog(@"No match found in file %@", searchedString); } }
代码说明
- HTML实体解码:我添加了可选的解码步骤,因为你的字符串里有
&(对应&),解码后能让字符串更贴近原始内容,如果你不需要这一步,可以直接用你原来的编码转换逻辑。 - 正则捕获组:
rangeAtIndex:0对应整个匹配的内容(完整条目),rangeAtIndex:1对应我们捕获的订单ID值,这样你可以按需获取。 - 分隔符处理:用
[^,]+确保我们只匹配到下一个逗号为止,不会误把后面的内容也包含进来。
这样修改后,你就能同时检查字符串是否包含Order Id(通过匹配结果的数量判断),并提取完整条目和对应的值了。
内容的提问来源于stack exchange,提问作者Mihir Oza
相关产品推荐
相关产品推荐

