<p>为了说明为什么regex对这类事情不实用,这里有一个regex,它将匹配给定的<code>abcghiijkyxz</code>示例中的<code>ghiijk</code>。注意,它还将匹配<code>abc</code>、<code>y</code>、<code>x</code>、<code>z</code>,因为技术上应该考虑按顺序排列的最长字母字符串。不幸的是,单独使用regex无法确定哪个最长,但这确实提供了所有的可能性。请注意,这个regex适用于PCRE,不能与python的<code>re</code>模块一起工作!另外,请注意,<a href="https://pypi.python.org/pypi/regex/" rel="nofollow noreferrer">python's ^{<cd8>}</a>库当前不支持<code>(*ACCEPT)</code>。虽然我还没有测试,<a href="https://pypi.python.org/pypi/re2/" rel="nofollow noreferrer">pyre2 package</a>(使用Cython的Google re2pyre2的python包装器)声称它是<a href="https://github.com/google/re2/wiki/Syntax" rel="nofollow noreferrer">supports the ^{<cd9>} control verb</a>,所以现在使用python可以实现这一点。在</p>
<p><a href="https://regex101.com/r/RxR4Va/6" rel="nofollow noreferrer">See regex in use here</a></p>
<pre><code>((?:a+(?(?!b)(*ACCEPT))|b+(?(?!c)(*ACCEPT))|c+(?(?!d)(*ACCEPT))|d+(?(?!e)(*ACCEPT))|e+(?(?!f)(*ACCEPT))|f+(?(?!g)(*ACCEPT))|g+(?(?!h)(*ACCEPT))|h+(?(?!i)(*ACCEPT))|i+(?(?!j)(*ACCEPT))|j+(?(?!k)(*ACCEPT))|k+(?(?!l)(*ACCEPT))|l+(?(?!m)(*ACCEPT))|m+(?(?!n)(*ACCEPT))|n+(?(?!o)(*ACCEPT))|o+(?(?!p)(*ACCEPT))|p+(?(?!q)(*ACCEPT))|q+(?(?!r)(*ACCEPT))|r+(?(?!s)(*ACCEPT))|s+(?(?!t)(*ACCEPT))|t+(?(?!u)(*ACCEPT))|u+(?(?!v)(*ACCEPT))|v+(?(?!w)(*ACCEPT))|w+(?(?!x)(*ACCEPT))|x+(?(?!y)(*ACCEPT))|y+(?(?!z)(*ACCEPT))|z+(?(?!$)(*ACCEPT)))+)
</code></pre>
<p>结果:</p>
^{pr2}$
<p>单个选项的说明,即<code>a+(?(?!b)(*ACCEPT))</code>:</p>
<ul>
<li><code>a+</code>匹配<code>a</code>(字面意思)一次或多次。这将捕获几个相同字符按顺序排列的实例,例如<code>aa</code>。在</li>
<li><code>(?(?!b)(*ACCEPT))</code>If子句计算条件。
<ul>
<li><code>(?!b)</code>if子句的条件。消极的前瞻性确保下面的内容是<strong>不是</strong><code>b</code>。这是因为如果它不是<code>b</code>,我们希望下面的控制动词生效。在</li>
<li><code>(*ACCEPT)</code>如果满足上述条件,我们接受当前的解决方案。此控制谓词导致正则表达式成功结束,跳过模式的其余部分。由于此令牌位于捕获组内,因此只有该捕获组在该特定位置成功结束,而父模式将继续执行。在</li>
</ul></li>
</ul>
<p>那么,如果条件不满足怎么办?好吧,这意味着<code>(?!b)</code>的值为false。这意味着下面的字符实际上是<code>b</code>,因此我们允许匹配(在本例中捕获)继续。请注意,整个模式被包装在<code>(?:)+</code>中,这允许我们匹配连续的选项,直到<code>(*ACCEPT)</code>控制动词或行尾满足为止。在</p>
<p>整个正则表达式的唯一例外是<code>z</code>。因为它是英语字母表中的最后一个字符(我想这是这个问题的目标),所以我们不关心后面是什么,所以我们可以简单地把<code>z+(?(?!$)(*ACCEPT))</code>放进去,这样可以确保<code>z</code>后面没有匹配的内容。相反,如果您想匹配<code>za</code>(如果这是恰当的术语,那么可以使用<code>z+(?(?!a)(*ACCEPT)))+</code>,如果这是正确的术语,那么可以使用<code>z+(?(?!a)(*ACCEPT)))+</code>,如图<a href="https://regex101.com/r/RxR4Va/7" rel="nofollow noreferrer">here</a>。在</p>