正则表达式没有来自有限字符池的重复字符

时间:2014-10-20 16:49:52

标签: regex

有没有办法编写正则表达式来匹配只包含某些字符的字符串,并且永远不会重复这些字符?我已经使用set来编写一些代码来实现它,但是想知道是否有正则表达式来实现它。

例如,如果我只想要一个包含[A,B,C]的字符串,并且我希望匹配一个永远不会复制任何字符的字符串,例如A,B,C,AB,AC, B,BC,ABC等,但从不匹配AA,BB,CC等

谢谢!

3 个答案:

答案 0 :(得分:9)

使用negative lookahead assertion

很容易
^(?!.*(.).*\1)[ABC]+$

与您描述的完全匹配。

测试live on regex101.com

<强>解释

^      # Start of the string
(?!    # Assert that it's impossible to match...
 .*    # Any number of characters (including zero)
 (.)   # followed by one character (remember this one in group 1)
 .*    # that's followed by any number of characters
 \1    # and the same character as before
)      # End of lookahead
[ABC]+ # Match one or more characters from this list
$      # until the end of the string

答案 1 :(得分:2)

可以使用

back referencing。这里有一个PHP示例,它与Perl正则表达式兼容:

$string = "A, B, C, AB, AC, B, BC, AABC";

if(preg_match('/([ABC])\1/', $string, $matches)) {
    echo $matches[1] . " has been repeated\n";
} else {
    echo "OK\n";
}

在上面的模式中,([ABC])是捕获组,可以存储字符ABC中的一个。 \1引用了第一个捕获组,如果重复这些字符,则会使模式匹配。

答案 2 :(得分:2)

我正在回答这个问题

Visual C++ Regex: Matching no repeating letter

已被标记为该问题的重复项。

不重复任何字母吗?
这是指连续的字母,还是abaca可以吗?

如果不是,则将正则表达式修改为:

^(?=.*[a-z])(?!.*([a-z]).*\1).{4,20}$

扩展

 ^ 
 (?= .* [a-z] )
 (?!
      .* 
      ( [a-z] )                     # (1)
      .* \1 
 )
 .{4,20} 
 $