2012-01-21 193 views
2

使用正則表達式捕獲字符串之前和之後的一些數據我是比較新的正則表達式的表達式,需要一些建議。在的ObjectiveC

的目標是在下面的格式中獲取數據到一個數組:

  • 值= 777
  • 值= 888

從這個數據:「值= @# !777 @#值= @#$ 888 *

這裏是我的代碼(目標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

嘿,你是對的。我只是想出了您的編輯根據您的第一個幫助和即將發表評論:) 一個件事壽,我將離開圖案(值=)[^ \\ d *(\\ d +),因爲「值=「始終有保證。非常感謝您的回答。將其標記爲正確。 –

0

正則表達式是匹配給定模式的表達式。正則表達式可以匹配,比如像 「價值=!@#777」 字符串使用類似的表達式 「值= [#@!%^ &] [0-9]」,這說來匹配字面「 value =「,然後是由字符#,@,!,%,^和&組成的任何字符串,最後是由數字組成的任何字符串。但是,您不能單獨使用單個正則表達式來獲取所需字符串的部分,即「value = 777」。

所以,一個解決方案是創建一個字符串識別諸如「值=!@#777」的表情,然後執行該字符串一些進一步的處理,以刪除有問題的字符。

我想你會使用NSScanner掃描數據和提取你想要的部分會更好。例如,您可以使用-scanString:intoString:來獲取「value =」部分,然後使用-scanCharactersFromSet:intoString:刪除不需要的部分,然後再次調用該方法以獲取數字的集合。

+0

只是一個簡短的說明,我的經驗是RegEx比NSScanner快得多,對於任何複雜的事情。 –

+1

當然,你可以得到匹配字符串的一部分,這是什麼組被用於。但是在這種情況下,你不會得到最終的'value = 777'作爲輸出,但是一次匹配會給你一個'value'(或者'value =')的組合,另一個匹配你需要的'777'結合。 – DarkDust

+0

@DarkDust我的意思是說一個正則表達式不能在一個單一的步驟中獲得所有的部分。您必須匹配所需的部分,然後重新組合它們,或匹配較長的部分並刪除不需要的部分,可能使用其他表達式。 – Caleb