NSRegularExpression - 匹配版本号

时间:2015-05-16 10:34:12

标签: ios regex swift nsregularexpression

为了检查字符串是否是S的版本号,我创建了以下模式:

NSRegularExpression

它工作得很好并允许我匹配:

  1. let pattern = "^(\\d+)(?:\\.(\\d+))?(?:\\.(\\d+))?(?:\\.)?$"
  2. "8"
  3. "12."
  4. "8.3"
  5. "8.10."
  6. "8.2.5"
  7. 但是,当我尝试使用以下模式进行改进时,它不再起作用了。

    "8.2.28."

    我的测试5和6不再起作用了。有什么想法吗?

2 个答案:

答案 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}期间},不创建新范围。相反,先前的范围会被覆盖。

它解释了为什么我的单元测试不再起作用了。 : - )

感谢大家的回答。