【问题标题】:How can I parse a string to extract numbers with a regular expression using NSRegularExpression?如何使用 NSRegularExpression 解析字符串以使用正则表达式提取数字?
【发布时间】:2013-01-17 04:40:30
【问题描述】:

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

有人可以帮忙为以下文本创建一个正则表达式吗?

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

【问题讨论】:

  • 到目前为止你想出的正则表达式是什么?

标签: objective-c regex macos cocoa nsregularexpression


【解决方案1】:

打破它。

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

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

  • \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,它以from 的形式为NSRegularExpression 添加了一些理智和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 告诉我我做错的所有事情:-)

【讨论】:

  • 我几乎没有提到这一点,因为它与此解决方案的正确性无关,而只是因为使用正确的术语总是好的:@"(\\d*\\.\\d *)" 是 NSString*,而不是 C stringC strings 是 char*
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-07
      • 2014-09-22
      • 2019-12-10
      • 2010-11-22
      • 2011-10-14
      相关资源
      最近更新 更多