我是正则表达式的新手,并且不知道如何使用它们。我想为下面的文本创建一个正则表达式来获取min,avg&最长时间。我将使用NSRegularExpression来获取范围&然后是字符串。
有人可以帮助创建以下文本的正则表达式。
round-trip min/avg/max/stddev = 3.073/6.010/13.312/2.789 ms
答案 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
增加了一些理智from
和allMatches
方法。以下是您使用它们的方式:
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)
我使用(.*) = (.+?)/(.+?)/(.+?)/(.*)