擅长:python、mysql、java
<p>这个解决方案与@ezig的答案不同。另一种看法:p</p>
<pre><code>^(.*?([^s](?=.*?h.*?m.*?p)|s).*?([^h](?=.*?m.*?p)|h).*?([^m](?=.*?p)|m).*?.)
</code></pre>
<p><a href="https://regex101.com/r/oA1zY3/1" rel="nofollow">Regex101</a></p>
<p>这个正则表达式的基本工作方式是每个字母都有一个部分。对于这个解释,我们将使用<code>s</code>,因为它是第一个。在</p>
<p>S:<code>([^s](?=.*?h.*?m.*?p)|s)</code></p>
<p>这意味着<em>“这里允许不匹配<code>s</code>,假设字符串的其余部分将正确匹配,否则我们需要在此处匹配<code>s</code>”</em></p>
<p>为什么这个正则表达式会比@ezig的答案慢得多,我们知道第一个字符将遵循模糊匹配的规则,并且我们不必对附加字符太过聪明。在</p>
<p>H:<code>([^h](?=.*?m.*?p)|h)</code></p>
<p>这一节之所以简短,是因为我们知道如果<code>s</code>不匹配,我们根本就不会匹配字符串,但因为我们在这里检查<code>h</code>,这可能不同于我们之前知道它必须匹配<code>s</code>。这意味着<em>“如果字符串的其余部分正确匹配,那么我们可以匹配<code>h</code>”</em>之外的内容。在</p>