正则表达式 - 非连续的重复范围

时间:2016-05-20 16:26:18

标签: regex

我正在尝试构建一个与模式匹配一​​定次数的正则表达式,例如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]作为例子,但它可能是其他任何东西)

1 个答案:

答案 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
}

但是,它不是一个纯粹的正则表达式解决方案。