1

次のコードがあります。

-(NSString*)getNumberFromString(NSString*)theString{
    NSError *error = NULL;
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"rhs: \"([0-9]*[.]*[0-9]*)" options:NSRegularExpressionCaseInsensitive | NSRegularExpressionAnchorsMatchLines error:&error];
    NSArray *matches = [regex matchesInString:theString options:0 range:NSMakeRange(0, [theString length])];
    NSTextCheckingResult *match = [matches objectAtIndex:0];
    return [theString substringWithRange:[match rangeAtIndex:1]]);
}

この文字列を解析しようとすると:

{lhs: "1 example", rhs: "44.5097254 Indian sample", error: "", icc: true}

結果が得られ44.5097254ます。

しかし、この文字列の場合:

{lhs: "1 example", rhs: "44.5097254.00.124.2 sample", error: "", icc: true}

の間違った結果が得られ44ます。を期待しています44.5097254.00.124.2

私は何を間違っていますか?

4

2 に答える 2

2

探している正規表現はrhs: \"(\d+(?:\.\d+)*).

-(NSString*)getNumberFromString:(NSString*)theString
{
    NSError *error = NULL;
    NSRegularExpression *regex =
    [NSRegularExpression regularExpressionWithPattern:@"rhs: \"(\\d+(?:\\.\\d+)*)"
                                              options:NSRegularExpressionCaseInsensitive | NSRegularExpressionAnchorsMatchLines
                                                error:&error];

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

    NSTextCheckingResult *match = [matches objectAtIndex:0];
    return [theString substringWithRange:[match rangeAtIndex:1]];
}

...
     NSLog(@"%@", [self getNumberFromString:
                   @"{lhs: \"1 example\", rhs: \"44.5097254.00.124.2 sample\", error: \"\", icc: true}"]);

出力: 44.5097254.00.124.2

于 2012-09-07T13:07:17.293 に答える
1

前の質問で編集したように、正規表現の末尾に * を追加すると、次のようになります。

  -(NSString*)getNumberFromString(NSString*)theString{
    NSError *error = NULL;
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"rhs: \"(([0-9]*[.]*[0-9]*)*)" options:NSRegularExpressionCaseInsensitive | NSRegularExpressionAnchorsMatchLines error:&error];
    NSArray *matches = [regex matchesInString:theString options:0 range:NSMakeRange(0, [theString length])];
    NSTextCheckingResult *match = [matches objectAtIndex:0];
    return [theString substringWithRange:[match rangeAtIndex:1]]);

}

将来のために、答えが何をするかを理解するようにしてください。コードをコピーして、要件に合わないことを認識するだけで問題ありません。でも、まずは自分で調べてみてください。スターを追加すると、式があらゆる長さの値で機能することが容易にわかります。

于 2012-09-07T13:34:42.053 に答える