正则表达式组匹配精确n次

12 投票
1 回答
15784 浏览
提问于 2025-04-18 17:23

我需要验证下面这种字符串格式:

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(?![^-])/

这里有一个 更新后的正则表达式演示!

撰写回答