正则表达式(正则表达式):每个字符最多可以出现给定的数量

时间:2014-03-29 13:45:45

标签: regex

到目前为止,我有这个正则表达式^(?!.*?(a|c|e|g|i).*?\1)[acegi]+$,它匹配任何单词作为字符“acegi”的组合,这些字符只能出现一次。

现在我正在尝试匹配任何由给定字符组成的单词,这些字符可以重复给定的次数。

给定字符集“acegii”

的示例

有效匹配:“acegii”“ace”“a”“i”“ai”“gii”“ici”“iic”“aicige”等。

无效比赛:“acegiii”“iacegii”“iii”“aa”“cc”等。

感谢您的帮助!

注意:如果可能,正则表达式中设置的字符应该可以轻松替换。

首选正则表达式:posix,ruby

2 个答案:

答案 0 :(得分:3)

您可以使用类似于您拥有的内容,但i使用第二个否定前瞻:

^(?!.*?([aceg]).*?\1)(?!.*?i.*?i.*?i)[acegi]+$

基本上,每个“最”出现次数都有一个负面的预测。

rubular demo

答案 1 :(得分:0)

量化你的前瞻:

/^(?!.*?([acegi])(?:.*?\1){N})[acegi]+$/

N替换为允许的出现次数 - 例如,{1}将允许每个字符中的一个出现。 {2}将允许一两次出现。 {3}最多允许三个,依此类推。

请记住,你是危险地接近灾难性回溯的道路,这可能会使你的剧本崩溃。

您可能希望使用字符串操作。总结:

  • 将字符串与/^[acegi]+$/
  • 匹配
  • 计算每个字符的出现次数(即迭代字符串)
  • 获取最大出现次数(如果操作正确,可以进行简单的max()调用)
  • 如果该最大值高于允许的限制,则触发失败。