如何计算所有可能的订单?

时间:2011-05-02 22:09:13

标签: regex

我有7件......

a b c d e f和g

七个项目可以按任何顺序排列。如何用正则表达式检查它们是否在那里(但没有),但没有其他项目......

^(A)→(B)→(C)→(d)〜(E)(F)〜(G)?$

Thad会检查七件物品是否缺少任何物品组合,但只能按顺序检查。如何对7项的任何可能顺序进行正则表达式检查?

这两个都会通过:

abcdefg
aceg

我也需要这些传递

bc
fabcd
bgef

我使用单个字母来简化事情。例如,(\stest)?将是其中一个项(\skey="([^"<>]+)?")?是另一个项的示例...我也希望防止重复。

这些不应该通过

abca
aa
gfdef

2 个答案:

答案 0 :(得分:1)

这样的事情会起作用:

^(?!(.*(a|b|c|d|e|f|g).*(\2)))((a|b|c|d|e|f|g)+)$

答案 1 :(得分:0)

如果你使用php使用preg_split七次a,b,c,d,e,f,g作为spliter expresion
连接结果并执行下一个 如果任何分割给你超过2个元素你有重复
如果你得到的最终字符串与''你有无效的部分不同。

这里有代码

// checks that any part present is valid but not repeated and not extra stuff
function checkAny($que) {
   // atention to the escaping \
   $toCheck = array('a','b','c','\\skey="([^"<>]+)?"','d','/slashtest','f','g');

   foreach($toCheck as $one){
      // $t = preg_split('/'.preg_quote($one,'/').'/', $que);  // preg_cuote is not valid for your propouse
      $t = preg_split('~'.$one.'~', $que);                     // so, select a proper sign insted of ~
      if(count($t)>2) return 'fail: repeated component/part';
      $que = implode('', $t);              // can use trim() here if it is usefull for you
      if($que=='')    return 'pass!!!';    //do not waste time doing any more tests
   }
   return 'fail: unknown component/part';
}

//test
echo checkAny('abcc');                 // fail
echo checkAny('ab/slashtestc');        // fail  because the repated a, be careful in test order to avoid this problem
echo checkAny('abcg');                 // pass
echo checkAny('ab key="xx"c');         // pass

如果php不是这种情况,preg_replace可以很容易替代任何支持正则表达式的语言