我正在尝试构建一个与模式匹配一定次数的正则表达式,例如3或5. [a-z]{3,5}
将匹配[a-z]
3,4或5次,但我不想要4。
我知道我可以做类似([a-z]{3})([a-z]{2})?
的事情,但这意味着对于我想要匹配模式3,5,7,13或29次的情况,最终的正则表达式会特别讨厌。
有没有更好的方法呢?
(我用[a-z]作为例子,但它可能是其他任何东西)
答案 0 :(得分:3)
正则表达式不支持任意“完全匹配X,Y或Z次”
也就是说,您可以使用([a-z]{29}|[a-z]{3}|[a-z]{3})
之类的内容列出匹配计数作为选项。但是,如果您的模式比[a-z]
更复杂,那么事情可能会变得混乱。
更实用的解决方案是计算模式匹配的次数,然后保留结果,如果它在可接受的重复列表中。在伪代码中,这看起来像:
acceptable_match_counts = [1, 3, 5, 7, 19, 32, 99];
num_matches = regex(/([a-z]){min,max}/, my_data);
if (num_matches in acceptable_match_counts) {
keep_match
} else {
reject_match
}
但是,它不是一个纯粹的正则表达式解决方案。