You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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);
    }
}

代码说明

  1. HTML实体解码:我添加了可选的解码步骤,因为你的字符串里有&amp;(对应&),解码后能让字符串更贴近原始内容,如果你不需要这一步,可以直接用你原来的编码转换逻辑。
  2. 正则捕获组:rangeAtIndex:0对应整个匹配的内容(完整条目),rangeAtIndex:1对应我们捕获的订单ID值,这样你可以按需获取。
  3. 分隔符处理:用[^,]+确保我们只匹配到下一个逗号为止,不会误把后面的内容也包含进来。

这样修改后,你就能同时检查字符串是否包含Order Id(通过匹配结果的数量判断),并提取完整条目和对应的值了。

内容的提问来源于stack exchange,提问作者Mihir Oza

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:49:02