为了检查字符串是否是S
的版本号,我创建了以下模式:
NSRegularExpression
它工作得很好并允许我匹配:
let pattern = "^(\\d+)(?:\\.(\\d+))?(?:\\.(\\d+))?(?:\\.)?$"
,"8"
,"12."
,"8.3"
,"8.10."
,"8.2.5"
。但是,当我尝试使用以下模式进行改进时,它不再起作用了。
"8.2.28."
我的测试5和6不再起作用了。有什么想法吗?
答案 0 :(得分:0)
实际上我已经尝试过以下事情并且工作正常。我认为问题相关你期望这行以数字开头,并以匹配的数字结束,所以可能是个问题。在这里,我尝试了以下事项。
t = s.length
输出:
打印:8
打印:12。
打印:8.3
打印:8.10。
打印:8.2.5
打印:8.2.28。
如果您只想匹配结束关键字,请在上面的表达式末尾添加$ signed,如下所示。
NSString* aString = @"8 iokdsa da 12. dasdsadaasd 8.3 cccc 8.10. rrr 8.2.5 rrrrr 8.2.28.";
NSRegularExpression* tableRegex = [[NSRegularExpression alloc] initWithPattern:@"(\\d+)(?:\\.(\\d+)){0,2}(?:\\.)?" options:0 error:NULL] ;
[tableRegex enumerateMatchesInString:aString options:0 range:NSMakeRange(0, [aString length]) usingBlock:^(NSTextCheckingResult *match, NSMatchingFlags flags, BOOL *stop){
NSLog(@"Print : %@",[aString substringWithRange:match.range]);
}];
希望这对你有所帮助。
答案 1 :(得分:0)
因此两种模式都匹配相同的整个字符串。但是,捕获括号在两种模式中都没有相同的行为。
如果我在字符串^(\\d+)(?:\\.(\\d+))?(?:\\.(\\d+))?(?:\\.)?$
上应用模式"1.2.3"
,则获得的NSTextCheckingResult
的{{1}}为4。
如果我在字符串numberOfRanges
上应用模式^(\\d+)(?:\\.(\\d+)){0,2}(?:\\.)?$
,则获得的"1.2.3"
的{{1}}为3.在第二次传入{{1}期间},不创建新范围。相反,先前的范围会被覆盖。
它解释了为什么我的单元测试不再起作用了。 : - )
感谢大家的回答。