我正在使用PHP的PCRE,而且我似乎无法做一些正则表达式。我有一个5个字符[adjxz]的字符类,它可以在字符串上的标记(|)之后以任何顺序出现或不出现。它们都可以出现,但它们只能出现一次。例如:
*|ad - is valid
*|dxa - is valid
*|da - is valid
*|a - is valid
*|aaj - is *not* valid
*|adjxz - is valid
*|addjxz - is *not* valid
知道我该怎么办吗?一个简单的[adjxz]+
,甚至[adjxz]{1,5}
都不起作用,因为它们允许重复。由于订单无关紧要,我不能/a?d?j?x?z?/
,所以我不知所措。
答案 0 :(得分:1)
也许使用前瞻结合这样的反向引用:
\|(?![adjxz]*([adjxz])[adjxz]*\1)[adjxz]{1,5}
如果您知道这些字符后跟其他内容,例如您可以将空白简化为:
\|(?!\S*(\S)\S*\1)[adjxz]{1,5}
答案 1 :(得分:1)
我认为你应该分两步来解决这个问题:
function strIsValid($str) {
if (!preg_match('/^\*|([adjxz]+)$/', $str, $matches)) {
return false;
}
return strlen($matches[1]) === count(array_unique(str_split($matches[1])));
}
答案 2 :(得分:0)
我建议使用反向逻辑,使用此模式匹配不需要的情况
\|.*?([adjxz])(?=.*\1)
Demo