2016-08-05 61 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}$)