3

我是正则表达式的新手,不知道如何使用它们。我想为下面的一段文本创建一个正则表达式来获取最小、平均和最大时间。我会将它们与 NSRegularExpression 一起使用来获取范围和字符串。

有人可以帮助为以下文本创建正则表达式。

round-trip min/avg/max/stddev = 3.073/6.010/13.312/2.789 ms
4

3 回答 3

8

把它分解。

我假设您想从该字符串中获取数值并扔掉其余的。

首先制作一个正则表达式来匹配一个数字:

  • \d匹配一个数字
  • \d*匹配零个或多个数字
  • \.匹配一个句点
  • (\d*\.\d*)匹配零个或多个数字,然后是句点,然后是零个或多个数字

然后把它变成一个 Cocoa 字符串:

  • @"(\\d*\\.\\d*)"

然后做一个NSRegularExpression

NSError error;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(\\d*\\.\\d*)"
    options:NSRegularExpressionCaseInsensitive
    error:&error];

然后得到一个包含所有匹配项的数组:

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

然后提取值:

NSString* minText = [string substringWithRange:[matches[0] range]];
NSString* avgText = [string substringWithRange:[matches[1] range]];
// etc.

我将这些字符串转换为浮点数作为练习。:-)


更新:我发现自己对它的复杂性感到非常恶心,所以我做了一个小库,我谦卑地称之为Unsuck ,它以和方法NSRegularExpression的形式增加了一些理智。以下是您如何使用它们:fromallMatches

NSRegularExpression *number = [NSRegularExpression from: @"(\\d*\\.\\d*)"];
NSArray *matches = [number allMatches:@"3.14/1.23/299.992"];

查看 github 上的 unsuck 源代码,并告诉我我做错的所有事情 :-)

于 2013-02-01T19:42:51.100 回答
1

我知道你想要一个正则表达式,它们学习起来非常方便,但在这种情况下,它可能比你需要的要重一些。考虑到这一点,我提供了一个替代方案。我相信其他人也会给你一个正则表达式。

NSString* str = @"round-trip min/avg/max/stddev = 3.073/6.010/13.312/2.789 ms";

NSString* str2 = [str substringFromIndex:32];

NSArray* components = [str2 componentsSeparatedByString:@"/"];

CGFloat min = [[components objectAtIndex:0] doubleValue];
CGFloat avg = [[components objectAtIndex:1] doubleValue];
CGFloat max = [[components objectAtIndex:2] doubleValue];

NSLog(@"min/avg/max: %f/%f/%f",min,avg,max);
于 2013-02-01T19:32:30.377 回答
0

我通过使用来管理这个(.*) = (.+?)/(.+?)/(.+?)/(.*)

于 2013-02-01T19:40:51.997 回答