NSRegularExpression - 匹配版本号

NSRegularExpression - Match version number

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

let pattern = "^(\d+)(?:\.(\d+))?(?:\.(\d+))?(?:\.)?$"

效果很好,可以匹配:

  1. "8",
  2. "12.",
  3. "8.3",
  4. "8.10.",
  5. "8.2.5",
  6. "8.2.28.".

但是,当我尝试使用以下模式对其进行改进时,它不再起作用了。

let pattern = "^(\d+)(?:\.(\d+)){0,2}(?:\.)?$"

我的测试 5 和 6 不再有效。有什么想法吗?

实际上我已经尝试了以下操作并且它工作正常。我认为问题与您期望该行以数字开头并以匹配的数字结尾所以可能是个问题。在这里,我尝试了以下操作。

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]);


    }];

输出:

打印:8

打印:12。

打印:8.3

打印:8.10.

打印:8.2.5

打印:8.2.28.

如果您只想匹配 end 关键字,则在上面的表达式末尾附加 $ 符号,如下所示。

(\d+)(?:\.(\d+)){0,2}(?:\.)?$

希望对您有所帮助。

嗯...我刚刚弄明白是什么问题了

所以两种模式都匹配相同的整个字符串。但是,捕获括号在两种模式中的行为不同。

如果我在字符串 "1.2.3" 上应用模式 ^(\d+)(?:\.(\d+))?(?:\.(\d+))?(?:\.)?$,则获得的 NSTextCheckingResultnumberOfRanges 为 4。

如果我在字符串 "1.2.3" 上应用模式 ^(\d+)(?:\.(\d+)){0,2}(?:\.)?$,则获得的 NSTextCheckingResultnumberOfRanges 为 3。似乎在第二次传递到 (?:\.(\d+)){0,2},未创建新范围。相反,先前的范围被覆盖。

它解释了为什么我的单元测试不再有效。 :-)

感谢大家的回答。