3

私は正規表現が初めてで、正規表現の使い方がわかりません。以下のテキストの正規表現を作成して、最小、平均、最大時間を取得したいと考えました。NSRegularExpression でそれらを使用して、範囲と文字列をフェッチします。

誰かが下のテキストの正規表現を作成するのを手伝ってくれますか?

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

3 に答える 3

8

それを分解します。

その文字列から数値を取得し、残りを投げたいと思います。

まず、数値に一致する正規表現を作成します。

  • \d数字と一致する
  • \d*0桁以上に一致
  • \.ピリオドに一致
  • (\d*\.\d*)0桁以上、次にピリオド、次に0桁以上に一致します

次に、それをココアストリングに変換します。

  • @"(\\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.

これらの文字列をフロートに変換するための演習として残しておきます。:-)


更新:私はこれの複雑さに非常に苛立ちを感じたので、私は謙虚にUnsuckNSRegularExpressionと呼んでいる小さなライブラリを作成しました。これは、メソッドの形式fromとメソッドにいくらかの正気を追加しallMatchesます。これらの使用方法は次のとおりです。

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

githubでサックされていないソースコードをチェックして、私が間違ったことをすべて教えてください:-)

于 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 に答える