正则表达式组匹配精确n次
我需要验证下面这种字符串格式:
text-text-id-text
分隔符是字符 '-'。第三列必须始终是 id。我写了下面这个正则表达式(用 Python),用来验证字符串:
import re
s = 'col1-col2-col3-id' # any additional text at the end
# is allowed e.g. -col4-col5
print re.match('^(.*-){3}id(-.*)?$', s) # ok
print re.match('^(.*-){1}id(-.*)?$', s) # still ok, is should not be
我尝试添加非贪婪模式,但结果还是一样:
^(.*?-){1}id(-.*)?$
我的正则表达式缺少了什么呢?我可以这样验证字符串:
>>> import re
>>> print re.split('-', 'col1-col2-col3-id')
['col1', 'col2', 'col3', 'id']
然后再检查第三个元素是否匹配 id,但我想知道为什么第一个正则表达式会像上面那样工作。
1 个回答
11
你的第一个正则表达式不对,因为它要求 id
必须在前三个项目之后出现。
你的第二个正则表达式匹配字符串时也不对,因为 .*
会把连字符也算进去。
你应该使用这个正则表达式:
/^(?:[^-]+-){2}id/
这里有一个 正则表达式演示!
如果你想把正则表达式固定在字符串的末尾,可以使用 /^(?:[^-]*-){2}id.*$/
!
正如 Tim Pietzcker 提到的,考虑把 id
放在项目的末尾来验证:
/^(?:[^-]+-){2}id(?![^-])/
这里有一个 更新后的正则表达式演示!