我有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
答案 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可以很容易替代任何支持正则表达式的语言