2016-08-05 64 views
2

我有一個版本「major.minor.patch」
主要版本範圍[0-99999]
次版本範圍[0-9999]
補丁版本範圍[0-999999]
但整體上「MAJOR.MINOR .path'不得超過16個字符,包括。 (點)。 我曾嘗試以下reg表達式正則表達式來設置組的長度在python

^(\d{1,5}[.]\d{1,4}[.]\d{1,6}){1,16}$ 

但{1,16}表示前面的表達式不前一組 的長度的1至16次重複我怎樣才能使以下組的長度爲16

(\d{1,5}[.]\d{1,4}[.]\d{1,6}) 
+0

你確定你需要這是一個單一的正則表達式嗎?讓你的正則表達式變爲'(\ d +)[。](\ d +)[。](\ d +)',然後再分別執行其餘的檢查會更簡單(看看版本範圍是否正確,如果是len )超出限制) – hugomg

回答

2

你有兩個正則表達式,他再要結合

  1. ^[\d.]{,16}$
  2. ^\d{1,5}[.]\d{1,4}[.]\d{1,6}$

兩者本身就是無效的,因爲(1)可以匹配超過2個點,並在每個版本的單個長度的限制將不被執行。 (2)肯定不起作用,因爲它超過了包括'。'在內的16個字符的字符串長度限制。

正則表達式lookhead的一個不太已知特徵可以用於(和-ED)這兩者會是這樣的

^(?=[\d.]{,16}$)\d{1,5}[.]\d{1,4}[.]\d{1,6}$ 

實施例在上述的正則表達式表達式組合:

exp = r'^(?=[\d.]{,16}$)\d{1,5}[.]\d{1,4}[.]\d{1,6}$' 
vers = ['111.111.111', 
     '111111.1111.1111', 
     '11111.1111.111111', 
     '11111.1111.11111'] 
["{} Matches ? {}".format(v, "YES" if re.match(exp, v) else "NO") 
for v in vers] 

輸出

['111.111.111 Matches ? YES', 
'111111.1111.1111 Matches ? NO', 
'11111.1111.111111 Matches ? NO', 
'11111.1111.11111 Matches ? YES'] 
+0

感謝Abhijit正則表達式向前看解決了這個問題。 –

1

在允許的比賽只有在其1-16範圍內使用$末錨內開始添加前瞻:(?=^.{1,16}$)