匹配多个字符而不重复正则表达式

时间:2013-12-10 18:14:34

标签: php regex pcre

我正在使用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?/,所以我不知所措。

3 个答案:

答案 0 :(得分:1)

也许使用前瞻结合这样的反向引用:

\|(?![adjxz]*([adjxz])[adjxz]*\1)[adjxz]{1,5}

demonstration

如果您知道这些字符后跟其他内容,例如您可以将空白简化为:

\|(?!\S*(\S)\S*\1)[adjxz]{1,5}

答案 1 :(得分:1)

我认为你应该分两步来解决这个问题:

  1. 检查意外字符的正则表达式
  2. 对重复字符进行简单的PHP检查
  3. 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