2012-06-09 107 views
5

我使用正則表達式解析器,但是,它似乎給一個結果了,這是我的代碼: 正則表達式:NSRegularExpression enumerateMatchesInString:options:range:usingBlock:給出一個空結果?

self.seatSelectRegex = [NSRegularExpression regularExpressionWithPattern:@"Seat ([0-9]{1,2}): (.*) \\([$£€]?([0-9.]+) in chips\\).*$" options:NSRegularExpressionAnchorsMatchLines error:&error]; 

代碼:

NSMutableDictionary *players = [[NSMutableDictionary alloc] init]; 
[self.seatSelectRegex enumerateMatchesInString:input options:NSMatchingCompleted range:NSMakeRange(0, input.length) usingBlock: 
^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) 
{ 

    NSLog(@"%lu", result.range.length); 
    Player *p = [[Player alloc] init]; 

    p.name = [input substringWithRange:[result rangeAtIndex:2]]; 
    p.seatNumber = [input substringWithRange:[result rangeAtIndex:1]].intValue; 
    p.stack = [input substringWithRange:[result rangeAtIndex:3]].doubleValue; 

    [players setValue:p forKey:p.name]; 
}]; 

我我期待3個結果與我的輸入,但是,我得到4,最後的結果有一個範圍與位置= 0和長度= 0(前三個都是正確的)。這是常見的行爲,我應該檢查範圍的位置和長度,還是在某處出現錯誤?

對於它的價值,這是我輸入:

PokerStars Hand #81669312371: Hold'em No Limit ($0.01/$0.02 USD) - 2012/06/08 16:57:33 CET [2012/06/08 10:57:33 ET] 
Table 'Icarus III' 6-max Seat #2 is the button 
Seat 2: SanderDecler ($2 in chips) 
Seat 3: ehrli87 ($0.90 in chips) 
Seat 4: umar.11 ($1.60 in chips) 
ehrli87: posts small blind $0.01 
umar.11: posts big blind $0.02 
*** HOLE CARDS *** 
Dealt to SanderDecler [Kh 7d] 
SanderDecler: raises $0.04 to $0.06 
ehrli87: folds 
umar.11: calls $0.04 
*** FLOP *** [Jc Tc Jh] 
umar.11: checks 
SanderDecler: bets $0.08 
umar.11: raises $0.24 to $0.32 
SanderDecler: folds 
Uncalled bet ($0.24) returned to umar.11 
umar.11 collected $0.28 from pot 
*** SUMMARY *** 
Total pot $0.29 | Rake $0.01 
Board [Jc Tc Jh] 
Seat 2: SanderDecler (button) folded on the Flop 
Seat 3: ehrli87 (small blind) folded before Flop 
Seat 4: umar.11 (big blind) collected ($0.28) 
+0

FWIW,您的正則表達式似乎正常工作(如預期的那樣,我在RegexBuddy中得到3個匹配項)。 –

+0

咋,我有一些其他正則表達式的問題,但因爲我只需要1個結果,那麼,我只是使用firstMatchInString:options:range:function ... –

回答

7

這是因爲使用您的NSMatchingReportCompletion選項與enumerateMatchesInString:options:range:usingBlock:。從Apples documentation

如果指定了NSMatchingReportCompletion匹配選項,塊對象將被調用後,一旦完成配對,以零結果和NSMatchingCompleted匹配標誌傳遞給塊標誌設置,加上任何附加NSMatchingHitEnd,NSMatchingRequiredEnd或NSMatchingInternalError中的相關「NSMatchingFlags」。

而你看到的最後一個塊調用與設置爲0的位置和長度範圍的原因是因爲你將消息發送到nil將返回nil(這是整數0)。

+0

謝謝!就是這樣。 –

+0

沒問題。不知道這個選項,所以謝謝你的問題:) –