<p>如果字符串必须至少包含abcd,但可以包含其他字符串,则可以使用此方法</p>
<p><code>(?=.*a)(?=.*b)(?=.*c)(?=.*d)</code></p>
<p>如果它们也只能包含abcd,那么这可能更好</p>
<p><code>^(?=.*a)(?=.*b)(?=.*c)(?=.*d)[abcd]+$</code></p>
<p><strong>更新</strong></p>
<p>为了回答您的问题,如果您正在寻找一个浮动版本,这是您想要的:</p>
<p><code>(?=([abcd]{4,}))(?=[bcd]*a)(?=[acd]*b)(?=[abd]*c)(?=[abc]*d)\1</code></p>
<p>扩展:</p>
<pre><code> # At POSition
(?= # Lookahead
( # Capture grp 1
[abcd]{4,} # Get 4 or more (greedy) 'a' or 'b' or 'c' or 'd' characters
)
)
(?= # Lookahead, check for 'a' (still at POS)
[bcd]*a # 0 or more [bcd]'s then 'a'
)
(?= # Lookahead, check for 'b' (still at POS)
[acd]*b # 0 or more [acd]'s then 'b'
)
(?= # Lookahead, check for 'c' (still at POS)
[abd]*c # 0 or more [abd]'s then 'c'
)
(?= # Lookahead, check for 'd' (still at POS)
[abc]*d # 0 or more [abc]'s then 'd'
)
\1 # Backref to capt grp 1, consume it
# Passed test, now at POSition + length of capture group 1
</code></pre>
<p><strong>更多</strong></p>
<p>您可以从搜索字符串系统地构造正则表达式。我对python不太了解,下面是一个如何用Perl实现的示例。但是请注意,字符串越长,查找匹配项所需的时间就越长,但这应该相当快。在</p>
^{pr2}$
<p>输出</p>
<pre><code>Found 'bddaaabcabbad'
Found 'abcd'
Found 'dcba'
Found 'abbcdd'
============
Search string = 'abcd'
Normalized = 'abcd'
Formed regex =
(?=([abcd]{4,}))(?=[bcd]*a)(?=[acd]*b)(?=[abd]*c)(?=[abc]*d)\1
============
Search string = '%^&*'
Normalized = '%^&*'
Formed regex =
(?=([\%\^\&\*]{4,}))(?=[\^\&\*]*\%)(?=[\%\&\*]*\^)(?=[\%\^\*]*\&)(?=[\%\^\&]*\*)\1
============
Search string = 'hi( )there'
Normalized = 'hi( )ter'
Formed regex =
(?=([hi\(\ \)ter]{8,}))(?=[i\(\ \)ter]*h)(?=[h\(\ \)ter]*i)(?=[hi\ \)ter]*\()(?=[hi\(\)ter]*\ )(?=[hi\(\ ter]*\))(?=[hi\(\ \)er]*t)(?=[hi\(\ \)tr]*e)(?=[hi\(\ \)te]*r)\1
============
Search string = '==-yes'
Normalized = '=-yes'
Formed regex =
(?=([\=\-yes]{5,}))(?=[\-yes]*\=)(?=[\=yes]*\-)(?=[\=\-es]*y)(?=[\=\-ys]*e)(?=[\=\-ye]*s)\1
</code></pre>