我有一个像'stackoverflow.html'这样的字符串,在正则表达式'stack(.).html'中我希望得到(.)中的值.
我只能找到NSPredicate:
NSString *string = @"stackoverflow.html";
NSString *expression = @"stack(.*).html";
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", expression];
BOOL match = [predicate evaluateWithObject:string]
Run Code Online (Sandbox Code Playgroud)
但是当我使用NSRegularExpression时,这只会告诉我有一个匹配并且不返回字符串:
NSRange range = [string rangeOfString:expression options:NSRegularExpressionSearch|NSCaseInsensitiveSearch];
if (range.location == NSNotFound) return nil;
NSLog (@"%@", [string substringWithRange:(NSRange){range.location, range.length}]);
Run Code Online (Sandbox Code Playgroud)
它会给我一个完整的字符串,stackoverflow.html,但我只对(.*)中的那些感兴趣.我想要'溢出'回来.在PHP中这很容易做到,但是如何在xCode for iOS中实现这一点?
从逻辑上讲,如果我这样做:
NSInteger firstPartLength = 5;
NSInteger secondPartLength = 5;
NSLog (@"%@", [string substringWithRange:(NSRange){range.location + firstPartLength, range.length - (firstPartLength + secondPartLength)}]
Run Code Online (Sandbox Code Playgroud)
它给了我属性结果'溢出'.但问题是在很多情况下我不知道第一部分或第二部分的长度.那么有没有办法让我得到应该在(.*)的值?
或者我必须通过找到(.)的位置并从那里计算第一和第二部分来决定选择最丑的方法吗?但是在正则表达式中你可能也有([az])但是然后用丑陋的方式使用另一个正则表达式获取()之间的值的位置然后用它来计算左右部分?如果我有更多,会发生什么?比如'A(. …
我只是无法弄清楚这是如何工作的.我想要做的是让两个玩家玩游戏,如果第三个玩家加入它可以立即加入游戏,如果第四个和最后一个玩家加入它也可以立即加入游戏.他们也可以随时出于任何原因离开游戏,如果发生这种情况,应该为另一个人或同一个人重新连接打开一个空间.这就是主意.
现在我得到的是以下内容.我出于显而易见的原因验证了本地播放器.然后我像这样搜索一个匹配:
if (matchRequest) [matchRequest release];
matchRequest = [[GKMatchRequest alloc] init];
matchRequest.minPlayers = 2;
matchRequest.maxPlayers = 4;
[[GKMatchmaker sharedMatchmaker] findMatchForRequest:matchRequest withCompletionHandler:^(GKMatch *match, NSError *error) {
if (error) {
// An error occured
} else {
if (matchCurrent) [matchCurrent release];
matchCurrent = [match retain];
matchCurrent.delegate = self;
}
}];
Run Code Online (Sandbox Code Playgroud)
如果我在三个不同的设备上执行这个部分,其中两个会找到对方,第三个仍在寻找.所以我想在找到匹配请求之后找到了它将被执行一次的最小数量的玩家.所以我需要的是一种方法,它使用我保留的matchCurrent来添加更多玩家.Luckely这种方法存在,但是如何运作呢?在这种情况下你什么时候打电话?我决定将它放在一个按钮下,这样我就可以在找到匹配项时手动执行它.
我发现当我在第一个设备上按下它时,最后第三个设备可以找到第一个和第二个设备所在的匹配.事实上,第二个和第三个设备包含所涉及的每个设备的playerID.这是件好事.但是有两个问题.
为什么,在调用该方法的设备上,不是更新了playerID?
[[GKMatchmaker sharedMatchmaker] addPlayersToMatch:matchCurrent matchRequest:matchRequest completionHandler:^(NSError *error) {
//matchCurrent.playerIDs is not updated?!
}];
Run Code Online (Sandbox Code Playgroud)
实际上他们已经更新了.当我看到第二个和第三个设备上出现播放器ID时,我手动更新设备1上的matchCurrent.playerIDs,突然它确实识别出播放器.然而,当在设备1上发现新玩家时,甚至不会调用玩家的'didChangeState'.
这对我来说很难(我)我希望人们可以帮助我.我有一些文本,我需要将它转移到一个数字,但它必须是唯一的,就像文本是唯一的一样.
例如:'kitty'这个词可以产生12432,但只有kitty这个词产生了这个数字.文本可以是任何内容,应给出适当的数字.
一个问题结果整数必须是一个32位无符号整数,这意味着最大可能的数字是2147483647.我不介意是否有文本长度限制,但我希望它可以尽可能大.
我的尝试.你有字母AZ和0-9所以一个字符可以有1-36之间的数字.但是如果A = 1且B = 2并且文本是A(1)B(2)并且你添加它你将得到3的结果,问题是文本BA产生相同的结果,所以这个算法不会工作.
有什么想法指出我正确的方向或是不可能做到的?