5

私はパーサーで正規表現を使用していますが、1 つの結果が得られるようです。これが私のコードです: 正規表現:

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 つの結果を期待していますが、最後の結果の範囲が場所 = 0、長さ = 0 の場合は 4 になります (最初の 3 つはすべて正しいです)。これは一般的な動作で、範囲の位置と長さを確認するだけでよいですか、それともどこかにエラーがありますか?

価値があるのは、これが私の入力です:

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)
4

1 に答える 1

8

これは、 でNSMatchingReportCompletionオプションを使用しているためenumerateMatchesInString:options:range:usingBlock:です。アップルのドキュメントから:

NSMatchingReportCompletion 一致オプションが指定されている場合、ブロック オブジェクトは、一致が完了した後に 1 回呼び出され、結果は nil になり、ブロックに渡されるフラグに NSMatchingCompleted 一致フラグが設定されます。さらに、NSMatchingHitEnd、NSMatchingRequiredEnd の中から関連する「NSMatchingFlags」が追加されます。 、または NSMatchingInternalError です。

そして、最後のブロック呼び出しが場所と長さが 0 に設定された範囲として表示される理由は、送信メッセージnilが返されるためnilです (これは整数 0 です)。

于 2012-06-09T15:07:27.907 に答える