【问题标题】:NSRegularExpression enumerateMatchesInString:options:range:usingBlock: giving a null result?NSRegularExpression enumerateMatchesInString:options:range:usingBlock: 给出一个空结果?
【发布时间】:2012-06-13 06:38:01
【问题描述】:

我在解析器中使用正则表达式,但是,它似乎给出了一个结果,这是我的代码: 正则表达式:

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 个,其中最后一个结果的范围是 location = 0 和 length = 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)

【问题讨论】:

  • FWIW,您的正则表达式似乎工作正常(我在 RegexBuddy 中得到 3 个匹配项,正如预期的那样)。
  • 是的,我在使用其他一些正则表达式时也遇到了同样的问题,但是因为我只需要 1 个结果,所以我只使用了 firstMatchInString:options:range: function...

标签: objective-c regex nsregularexpression


【解决方案1】:

这是因为您将NSMatchingReportCompletion 选项与enumerateMatchesInString:options:range:usingBlock: 一起使用。来自Apples documentation

如果指定了 NSMatchingReportCompletion 匹配选项,则在匹配完成后会调用 Block 对象一次,结果为 nil,并且在传递给 Block 的标志中设置了 NSMatchingCompleted 匹配标志,加上任何其他相关的“NSMatchingFlags” NSMatchingHitEnd、NSMatchingRequiredEnd 或 NSMatchingInternalError。

您将最后一个块调用视为位置和长度设置为 0 的范围的原因是因为您将消息发送到 nil 将返回 nil(即整数 0)。

【讨论】:

  • 没问题。不知道那个选项所以谢谢你的问题:)
猜你喜欢
  • 2014-08-07
  • 2015-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多