0

我对 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从字符串中找到部分。如果可能的话,是否每次都可以稍微更改一下代码,以便在字符串中找到第 N 次出现的单词。如果它有任何区别,我将在 iPhone 应用程序中使用此代码,从而在 Objective-C 中使用。

4

2 回答 2

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
于 2012-06-18T18:26:17.000 回答
0

您可以尝试以下方法。您将不得不用您的正则表达式模式替换 regex_pattern。在您的情况下, regex_pattern 应该类似于@"\\s\\d\\dC"(a whitespace character ( \\s) 后跟一个数字 ( \\d) 后跟一个 digit ( \\d) 后跟一个大写字母C

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

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);
}
于 2012-06-18T16:20:35.403 回答