匹配第二次在正则表达式中找到一个单词

时间:2012-06-18 15:34:07

标签: objective-c ios regex

我对Regex很陌生,我只是试图理解它。我试图搜索的字符串是:

100 ON 12C 12,41C High Cool OK 0
101 OFF 32C 04,93C Low Dry OK 1
102 ON 07C 08,27C High Dry OK 0

我要做的是找出部件以从字符串中找到部件32C。如果可能的话,代码是否能够每次都改变一点,以便在String中找到第N个出现的单词。如果它有任何区别,我将在iPhone应用程序中使用此代码,从而使用Objective-C。

2 个答案:

答案 0 :(得分:1)

你的例子是面向行的,权重相等(同时)偏向字符串中行的开头。

如果您的引擎风格进行分组,您应该能够指定一个出现量词,它将为您提供单一的确切答案,而无需进行数组等。
在这两种情况下,答案都在捕获缓冲区1中。

示例:

$occurance = "2";
---------
/(?:[^\n]*?(\d+C)[^\n]*.*?){$occurance}/s
---------
or
---------
/(?:^.*?(\d+C)[\S\s]*?){$occurance}/m

展开:

 /
 (?:
      [^\n]*?
      ( \d+C )
      [^\n]* .*?
 ){2}
 /xs


 /
 (?:
      ^ .*?
      ( \d+C )
      [\S\s]*?
 ){2}
 /xm

答案 1 :(得分:0)

您可以尝试以下内容。您必须使用正则表达式模式替换regex_pattern。在您的情况下,regex_pattern应该类似于@"\\s\\d\\dC"(空白字符(\\s)后面跟一个数字(\\d)后跟一个数字(\\d)跟随上面 - 大写字母C

如果您可以确定字母C永远不会是小写字母,您可能还希望删除NSRegularExpressionCaseInsensitive选项。

NSError *error = nil;

NSString *regex_pattern = @"\\s\\d\\dC";

NSRegularExpression *regex =
    [NSRegularExpression regularExpressionWithPattern:regex_pattern
    options:(NSRegularExpressionCaseInsensitive |
         NSRegularExpressionDotMatchesLineSeparators)
    error:&error];

NSArray *arrayOfMatches = [regex matchesInString:myString
                                 options:0
                                 range:NSMakeRange(0, [myString length])];

// arrayOfMatches now contains an array of NSRanges;
// now, find and extract the 2nd match as an integer:

if ([arrayOfMatches count] >= 2)  // be sure that there are at least 2 elements in the array
{
    NSRange rangeOfSecondMatch = [arrayOfMatches objectAtIndex:1];  // remember that the array indices start at 0, not 1
    NSString *secondMatchAsString = [myString substringWithRange:
        NSMakeRange(rangeOfSecondMatch.location + 1,  // + 1 to skip over the initial space
                    rangeOfSecondMatch.length - 2)]  // - 2 because we ignore both the initial space and the final "C"

    NSLog(@"secondMatchAsString = %@", secondMatchAsString);

    int temperature = [secondMatchAsString intValue];  // should be 32 for your sample data

    NSLog(@"temperature = %d", temperature);
}