擅长:python、mysql、java
<p>你可以用这个模式</p>
<pre><code>r'(x?y?|yx)b'
</code></pre>
<p>要分解,有趣的部分<code>x?y?|yx</code>将匹配:</p>
<ol>
<li>空字符串</li>
<li>只有x</li>
<li>只有y</li>
<li>xy公司</li>
<li>在另一个分支,yx</li>
</ol>
<p>作为一个建议,当您对regex不太满意并且场景数量很少时,您可以简单地强制模式。这很难看,但它清楚地表明了你的情况:</p>
^{pr2}$
<hr/>
<p><strong>第2部分。</strong></p>
<p>对于一个通用的解决方案,它也会这样做,但是对于任意数量的字符,而不仅仅是<em>{x,y}</em>,可以使用以下regex样式:</p>
<pre><code>r'(?=[^x]*x?[^x]*b)(?=[^y]*y?[^y]*b)(?=[^z]*z?[^z]*b)[xyz]*b'
</code></pre>
<p>我来解释一下:</p>
<ul>
<li>通过使用lookaheads,您可以向前移动regex光标,对于每个位置,您只需“向前看”,看看下面的内容是否符合特定条件。通过使用此技术,您可以将多个条件组合到一个正则表达式中。在</li>
<li>对于光标位置,我们测试集合中的每个字符,使其从该位置最多出现一次,直到我们匹配目标<em>b</em>字符。我们用这个模式<code>[^x]*x?[^x]*</code>,这意味着<em>匹配not-x如果有,最多匹配一个x,然后匹配任意数量的not x</em></li>
<li>一旦满足了测试条件,我们就开始移动光标并匹配所需集合中的所有字符,直到找到a<em>b</em>。在这一点上,我们保证不会匹配任何重复项,因为我们执行了前瞻性测试。在</li>
</ul>
<p>注意:我强烈怀疑它的性能很差,因为它有回溯功能。你应该只对小的测试字符串使用它。在</p>
<p><a href="https://ideone.com/pvh6Lt" rel="nofollow noreferrer">Test it.</a></p>