如何使用NSRegularExpression解析字符串以使用正则表达式提取数字?

时间:2013-02-01 19:25:14

标签: objective-c regex macos cocoa nsregularexpression

我是正则表达式的新手,并且不知道如何使用它们。我想为下面的文本创建一个正则表达式来获取min,avg&最长时间。我将使用NSRegularExpression来获取范围&然后是字符串。

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

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

3 个答案:

答案 0 :(得分: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"];

check out the unsuck source code on github并告诉我所有错误的事情: - )

答案 1 :(得分: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);

答案 2 :(得分:0)

我使用(.*) = (.+?)/(.+?)/(.+?)/(.*)

进行了管理