<p>使用前瞻确保包含三个(或更多)不同字符的任何字符串失败:</p>
<pre><code>^(?!.*(.).*(?!\1)(.).*(?!\1|\2).)[xyz]+$
</code></pre>
<p>见<a href="https://regex101.com/r/GQ64yP/1" rel="nofollow noreferrer">proof</a></p>
<p>Python:</p>
<pre><code>regex = r"^(?!.*(.).*(?!\1)(.).*(?!\1|\2).)[xyz]+$"
</code></pre>
<p><strong>解释</strong></p>
<pre><code> EXPLANATION
--------------------------------------------------------------------------------
^ the beginning of the string
--------------------------------------------------------------------------------
(?! look ahead to see if there is not:
--------------------------------------------------------------------------------
.* any character except \n (0 or more times
(matching the most amount possible))
--------------------------------------------------------------------------------
( group and capture to \1:
--------------------------------------------------------------------------------
. any character except \n
--------------------------------------------------------------------------------
) end of \1
--------------------------------------------------------------------------------
.* any character except \n (0 or more times
(matching the most amount possible))
--------------------------------------------------------------------------------
(?! look ahead to see if there is not:
--------------------------------------------------------------------------------
\1 what was matched by capture \1
--------------------------------------------------------------------------------
) end of look-ahead
--------------------------------------------------------------------------------
( group and capture to \2:
--------------------------------------------------------------------------------
. any character except \n
--------------------------------------------------------------------------------
) end of \2
--------------------------------------------------------------------------------
.* any character except \n (0 or more times
(matching the most amount possible))
--------------------------------------------------------------------------------
(?! look ahead to see if there is not:
--------------------------------------------------------------------------------
\1 what was matched by capture \1
--------------------------------------------------------------------------------
| OR
--------------------------------------------------------------------------------
\2 what was matched by capture \2
--------------------------------------------------------------------------------
) end of look-ahead
--------------------------------------------------------------------------------
. any character except \n
--------------------------------------------------------------------------------
) end of look-ahead
--------------------------------------------------------------------------------
[xyz]+ any character of: 'x', 'y', 'z' (1 or more
times (matching the most amount possible))
--------------------------------------------------------------------------------
$ before an optional \n, and the end of the
string
</code></pre>