我有一个版本'major.minor.patch'
主要版本范围[0-99999]
次要版本范围[0-9999]
补丁版本范围[0-999999]
但总的来说'major.minor.path'不应超过16个字符,包括。 (点)。
我尝试过以下reg表达式
^(\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 :(得分:2)
这里有两个你要组合的正则表达式
^[\d.]{,16}$
^\d{1,5}[.]\d{1,4}[.]\d{1,6}$
两者本身都是无效的,因为(1)可以匹配超过2个点,并且不尊重每个版本的个别长度限制。 (2)肯定不起作用,因为它超过16个字符的字符串长度限制,包括'。'
一个鲜为人知的正则表达式的特征可以用来组合(和 - )上面的正则表达式,就像
^(?=[\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']
答案 1 :(得分:1)
在开头添加一个前瞻,只有在1到16范围内时才能使用$
锚定在最后:(?=^.{1,16}$)