2015-05-16 36 views
0

为了检查一个字符串是否是一个版本号感谢NSRegularExpression,我创建了以下的模式: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不工作了。任何想法为什么?

+0

你在寻找匹配的结束字符串从整个字符串?或匹配任何位置的整个字符串中的任何数字字符串? –

+0

@无:我只想匹配只包含一个版本号的字符串。我写的第一个模式效果很好,我只是想将其改进得更短,更具可读性。 –

+0

它工作.'https:// www.regex101.com/r/fJ6cR4/4' – vks

回答

0

哼哼......我刚想清楚是什么问题。

所以两个模式匹配相同的整个字符串。然而,捕获括号在两种模式中都没有相同的行为。

如果我申请图案^(\\d+)(?:\\.(\\d+))?(?:\\.(\\d+))?(?:\\.)?$上串"1.2.3",所获得的NSTextCheckingResult具有4.

一个numberOfRanges如果我申请图案^(\\d+)(?:\\.(\\d+)){0,2}(?:\\.)?$在串"1.2.3",所获得的NSTextCheckingResult具有3. numberOfRanges似乎在第二次进入(?:\\.(\\d+)){0,2}期间,不会创建新的范围。相反,以前的范围被覆盖。

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

感谢大家的回答。

0

其实我已经试过以下的东西,它的工作正常。我认为问题与你相关,你期望线路以数字开始,并以匹配数字结束,所以可能是一个问题。在这里我尝试了以下事情。

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。

如果你想就这样结束关键字匹配然后贴在$上面表达的结束就像下面签名。

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

希望这对你有所帮助。

+0

就像我在我的问题的评论中解释的,我只想匹配只包含一个版本号(不包含其他字符)的字符串。这就是为什么我添加'^'和'$'的原因。 –