2015-05-16 64 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

就像我在我的問題的評論中解釋的,我只想匹配只包含一個版本號(不包含其他字符)的字符串。這就是爲什麼我添加'^'和'$'的原因。 –