Objective c 第二次在正则表达式中找到单词时进行匹配

Objective c 第二次在正则表达式中找到单词时进行匹配,objective-c,ios,regex,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。如果可能的话,代码是否可以每次稍微更改一点,以便找到字符串中出现的第n个单词。如果有什么不同,我将在iPhone应用程序中使用这段代码,从而使用Objective-C。您可以尝试以下内容。您必

我对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。

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

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

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);
}

您的示例是面向行的,并且重量相等(同时)偏向于字符串中行的开头

如果您的引擎没有进行分组,那么您应该能够指定一个发生量词,该量词将为您提供一个准确的答案,而不需要进行数组之类的操作。
在这两种情况下,答案都在捕获缓冲区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

为什么使用正则表达式?为什么不在换行符上拆分字符串,然后在空白处拆分字符串?那么(伪代码)
mystrings[1][2]
将是
32C
(而
mystrings[2][2]
将是
07C
等等)。该系统是一个大型系统的一部分,该系统将控制许多不同类型的硬件。例如,它将控制音乐系统、空调、电视等。为每个系统开发驱动程序需要很长时间,因此,人们认为这是一种更容易从我们返回的字符串中获取数据的方法通过硬件。我看不到这里的联系。我喜欢正则表达式,但我不认为在这种情况下它们是一个可用的、可扩展的、可维护的工具。基本上,我们正试图摆脱驱动程序开发,这样用户就可以只得到一些代码来放入他们的软件中,并找到他们需要的信息。ap可能需要3周的时间请允许应用程序进行更新,如果我的用户现在想控制他们的新电视,他们会希望它快于3周。因此,我们正试图找到一种方法,以编程方式从返回的字符串中检索信息。很抱歉,如果这没有意义,这是我们面临的一个相当精确的问题。您的简短回答是:你的问题是肯定的。你可以得到一个匹配你的正则表达式的数组。然后你可以从该数组中选择第n个匹配。我怎么知道它是否支持分组?这似乎没问题。有没有办法只返回数字而不返回空格或“C”呢是的,我已经扩展了上面的示例代码,以展示如何做到这一点。