2012-01-21 4 views
2

私は正規表現には比較的新しいので、いくつかのアドバイスが必要です。ObjectiveCで正規表現を使用してデータの前後に文字列を取り込みます

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

  • 値= 777
  • 値= 888

:「値= @#! !

:ここでは777#値@ = * 888 #$ @」

は私のコード(のObjective C)であります

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

だから私の質問は以下のとおりです。

1)は、そのように分割された正規表現エンジンキャプチャデータできますか?真ん中のガベージデータを削除する "value ="を検索し、番号 "777"などでグループ化しますか?

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

答えて

3

先読み(?=)がここに間違っている、あなたは正しく\d(それは\\dになります)、最後に脱出していないではなく、少なくとも、あなたは取り残さ数量*(0回以上)と+(1回以上):

NSString *aTestString = @"[email protected]#[email protected]#[email protected]#$**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 = @"[email protected]#[email protected]#[email protected]#$**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 
+0

あなたは正しいですね。私はちょうどあなたの最初のヘルプに基づいてあなたの編集を考え出し、コメントしようとしていた:) 1つのことtho、私は(値=)[^ \\ d] *(\\ d +) = "は常に保証されます。あなたの答えに感謝します。正しいとフラグを立てる。 –

0

正規表現は、与えられたパターンに一致する式です。正規表現は、 "value =!@#777"のような文字列と、 "value = [#@!%^ &] [0-9]"という文字列を照合することができます。 #、@、!、%、^、および&の文字列で構成された任意の文字列、最後に数字で構成された任意の文字列が含まれます。しかし、単一の正規表現を単独で使用して、必要な文字列の一部、つまり "value = 777"を取得することはできません。

したがって、 "value =!@#777"などの文字列を認識する式を作成し、その文字列を処理して問題の文字を削除します。

NSScannerを使用してデータをスキャンし、必要な部分を抽出する方がよいと思います。たとえば、-scanString:intoString:を使用して「値=」部分を取得し、次に-scanCharactersFromSet:intoString:を使用して、不要な部分を削除してから、その方法を再度呼び出して数字の集まりを取得することができます。

+0

簡単なことに、私の経験ではRegExはNSScannerよりもはるかに高速です。 –

+1

もちろん、一致する文字列の一部、つまりどのグループが使用されているかを取得することができます。しかし、この場合、出力として最終的な 'value = 777'を得ることはできませんが、1つのマッチは' value'(または 'value =')のグループと '777'のためのグループ結合します。 – DarkDust

+0

@DarkDust私は、1つの正規表現ですべての部分を1つのステップで得ることができないということを意味しました。必要なパーツと一致するか、後でそれらを再結合するか、長いセクションにマッチさせて、不要なパーツを削除しなければなりません。 – Caleb

関連する問題