使用正则表达式在单个调用中从一个字符串中提取多个值

时间:2016-02-10 16:16:05

标签: objective-c regex

我正在寻找从这个字符串中提取的方法:

"Per 100g - Calories: 274kcal | Fat: 14.08g | Carbs: 35.71g | Protein: 3.49g"

以下内容:

"100g", "247", "14.08", "35.71", "3.49"

这是我尝试的内容:

   NSString *patternString = @"Per (.*) - Calories: (\\d*)kcal | Fat: (\\d*.\\d*)g | Carbs: (\\d*.\\d*)g | Protein: (\\d*.\\d*)g";
    regex = [NSRegularExpression regularExpressionWithPattern:patternString options:NSRegularExpressionCaseInsensitive error:&error];
    NSLog(@"length of overall matches is %d", (int)[matches count]);
    parsedString = [stringToParse substringWithRange:[matches[0] rangeAtIndex:1]];
    NSLog(@"and here is the parsed string %@", parsedString);

但是我只获得了一场比赛,捕获了第一组,并且只返回100g而不是其他任何内容。有没有办法一举提取所有这些数字?请注意,Per ___是一个变量字符串,并且不会总是以一定数量的克数形式出现。

感谢您的任何建议。

1 个答案:

答案 0 :(得分:0)

你需要逃避" |"模式中的字符:

NSString *text = @"Per 100g - Calories: 274kcal \\| Fat: 14.08g \\| Carbs: 35.71g \\| Protein: 3.49g";
NSRange   searchedRange = NSMakeRange(0, text.length);
NSString *patternString = @"Per (.*) - Calories: (\\d*)kcal \\| Fat: (\\d*.\\d*)g \\| Carbs: (\\d*.\\d*)g";
NSError *error;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:patternString options:NSRegularExpressionCaseInsensitive error:&error];

NSTextCheckingResult* match = [regex firstMatchInString:text options:0 range: searchedRange];
for (int group = 1; group<match.numberOfRanges; group++) {
    NSLog(@"match %i: %@", group, [text substringWithRange:[match rangeAtIndex:group]]);
}

输出:

  

匹配1:100g
  比赛2:274
  比赛3:14.08
  比赛4:35.71