2

私は正規表現に比較的慣れていないため、アドバイスが必要でした。

目標は、次の形式のデータを配列に取得することです。

  • 値=777
  • 値=888

このデータから: "value=!@#777!@#value=@#$ 888* "

これが私のコードです(Objective C):

NSString *aTestString = @"value=!@#777!@#value=@#$**888***";
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"value=(?=[^\d])(\d)" options:0 error:&anError];

だから私の質問は:

1) 正規表現エンジンは、そのように分割されたデータをキャプチャできますか? 「値=」を取得して途中のゴミデータを削除し、その番号「777」などでグループ化しますか?

2) これができる場合、私の正規表現は有効ですか? 値=(?=[^\d])(\d)

4

2 に答える 2

3

ここでは先読み ( ?=) が間違っています。\d( になる\\d) を正しくエスケープしていませんが、量指定子*(0 回以上) と+(1回以上) を省略しています。

NSString *aTestString = @"value=!@#777!@#value=@#$**888***";
NSRegularExpression *regex = [NSRegularExpression
    regularExpressionWithPattern:@"value=[^\\d]*(\\d+)"
    options:0
    error:NULL
];

[regex 
    enumerateMatchesInString:aTestString
    options:0
    range:NSMakeRange(0, [aTestString length])
    usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {
        NSLog(@"Value: %@", [aTestString substringWithRange:[result rangeAtIndex:1]]);
    }
];

編集:これはより洗練されたパターンです。の前の単語をキャッチし=、次に数字以外を破棄し、その後の数字をキャッチします。

NSString *aTestString = @"foo=!@#777!@#bar=@#$**888***";
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(\\w+)=[^\\d]*(\\d+)" options:0 error:NULL];

[regex 
    enumerateMatchesInString:aTestString
    options:0
    range:NSMakeRange(0, [aTestString length])
    usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {
        NSLog(
            @"Found: %@=%@",
            [aTestString substringWithRange:[result rangeAtIndex:1]],
            [aTestString substringWithRange:[result rangeAtIndex:2]]
        );
    }
];

// Output:
// Found: foo=777
// Found: bar=888
于 2012-01-21T22:59:31.610 に答える
0

正規表現は、特定のパターンに一致する式です。正規表現は、たとえば、"value=[#@!%^&] [0-9] "のような表現を使用して、"value=!@#777" のような文字列に一致する可能性があります。これは、リテラル "value= "、次に文字 #、@、!、%、^、& で構成される任意の文字列、最後に数字で構成される任意の文字列。しかし、単一の正規表現を単独で使用して、必要な文字列の一部、つまり "value=777" だけを取得することはできません。

したがって、1 つの解決策は、"value=!@#777" などの文字列を認識する式を作成し、その文字列に対してさらに処理を行って問題のある文字を削除することです。

NSScanner を使用してデータをスキャンし、必要な部分を抽出した方がよいと思います。たとえば、を使用-scanString:intoString:して「value=」部分を取得し、続い-scanCharactersFromSet:intoString:て不要な部分を削除してから、そのメソッドを再度呼び出して数字のコレクションを取得できます。

于 2012-01-21T22:59:40.800 に答える