有没有办法编写正则表达式来匹配只包含某些字符的字符串,并且永远不会重复这些字符?我已经使用set来编写一些代码来实现它,但是想知道是否有正则表达式来实现它。
例如,如果我只想要一个包含[A,B,C]的字符串,并且我希望匹配一个永远不会复制任何字符的字符串,例如A,B,C,AB,AC, B,BC,ABC等,但从不匹配AA,BB,CC等
谢谢!
答案 0 :(得分:9)
使用negative lookahead assertion:
很容易^(?!.*(.).*\1)[ABC]+$
与您描述的完全匹配。
<强>解释强>
^ # 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])
是捕获组,可以存储字符A
,B
或C
中的一个。 \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}
$