<p><code>I realise it is to do with the greediness of the [BA]{1,6}. Is there a way to make the regex match everything from the laziest to the greediest possible pattern?</code></p>
<p>问题是双重的。在</p>
<pre><code>1. Regex engines will only match once at a character position.
2. There is not a regex construct of between lazy and greedy
it's either one or the other.
</code></pre>
<p>跳过问题1。目前</p>
<p><strong>问题2</strong>:<br/>
可能存在<code>{1,6}</code>1、2、3、4、5或6个匹配项<br/>
一个结构(字符)在一个给定的位置。在</p>
<p>要解决这个问题,您必须指定独立的{1}、{2}、{3}、{4}、{5}、{6}<br/>
作为该位置的可选替代。<br/>
显然,一个<em>范围</em><code>{1,6}</code>是行不通的。在</p>
<p>就<em>范围</em>而言,可以指定它来查找<br/>
添加lazy修饰符的最小值<code>{1,6}?</code><br/>
但这只会找到它能找到的最小的数量,不能多,不能少。在</p>
<p>最后</p>
<p><strong>问题1</strong>:<br/>
当正则表达式引擎匹配时,它总是将当前位置向前推进<br/>
等于最后一次匹配的长度。<br/>
如果断言的长度为0,则会人为地增加br/>
位置向前一个字符。在</p>
<hr/>
<p>因此,考虑到这两个问题,我们可以利用这些优势/劣势来实现<br/>
想办法解决问题,还要忍受一些副作用。在</p>
<p><strong>解决方法</strong>:<br/>
把所有可能的选择放在一个位置作为要分析的断言。
在一个位置的每个匹配项都将包含一个包含变体的组的列表。<br/>
所以,如果你在6个可能的变量组中匹配了3个变量,那么有值的组就是变量。在</p>
<p>如果没有一组有值,则在该位置没有发现变体。<br/>
因为所有的断言都是可选的,所以不会发生任何变体。<br/>
为了避免在这些特定位置进行不必要的匹配,最终<br/>
<em>条件</em>可用于不报告这些。(即<code>(?(1)|(?(2)|(?!)))</code>等)。在</p>
<hr/>
<p>以您的<em>范围</em>为例。<br/>
我们将使用末尾的条件来验证匹配的组,<br/>
但没有它也可以做到。<br/>
_请注意,使用这个<em>范围</em>示例会导致相同<br/>的重叠
最终匹配中的值。这不会在<br/>确保唯一匹配
一个位置(下面的例子展示了如何避免这种情况)。在</p>
^{pr2}$
<p>输出:</p>
<pre><code> ** Grp 1 - ( pos 0 , len 5 )
AABAA
** Grp 2 - ( pos 0 , len 9 )
AABAABBAA
-
** Grp 1 - ( pos 3 , len 6 )
AABBAA
** Grp 2 - ( pos 3 , len 6 )
AABBAA
</code></pre>
<hr/>
<p>相同,但没有<em>范围</em>问题。<br/>
在这里,我们明确定义了独特的结构。<br/>
<em>注意每个位置的唯一值。</em></p>
<pre><code> # (?=(A{2}[BA]{1}A{2}))?(?=(A{2}[BA]{2}A{2}))?(?=(A{2}[BA]{3}A{2}))?(?=(A{2}[BA]{4}A{2}))?(?=(A{2}[BA]{5}A{2}))?(?=(A{2}[BA]{6}A{2}))?(?(1)|(?(2)|(?(3)|(?(4)|(?(5)|(?(6)|(?!)))))))
(?=
( # (1 start)
A{2}
[BA]{1}
A{2}
) # (1 end)
)?
(?=
( # (2 start)
A{2}
[BA]{2}
A{2}
) # (2 end)
)?
(?=
( # (3 start)
A{2}
[BA]{3}
A{2}
) # (3 end)
)?
(?=
( # (4 start)
A{2}
[BA]{4}
A{2}
) # (4 end)
)?
(?=
( # (5 start)
A{2}
[BA]{5}
A{2}
) # (5 end)
)?
(?=
( # (6 start)
A{2}
[BA]{6}
A{2}
) # (6 end)
)?
(?(1)|(?(2)|(?(3)|(?(4)|(?(5)|(?(6)|(?!)))))))
</code></pre>
<p>输出:</p>
<pre><code> ** Grp 1 - ( pos 0 , len 5 )
AABAA
** Grp 2 - NULL
** Grp 3 - NULL
** Grp 4 - NULL
** Grp 5 - ( pos 0 , len 9 )
AABAABBAA
** Grp 6 - NULL
** Grp 1 - NULL
** Grp 2 - ( pos 3 , len 6 )
AABBAA
** Grp 3 - NULL
** Grp 4 - NULL
** Grp 5 - NULL
** Grp 6 - NULL
</code></pre>
<p>最后,您需要做的就是在每次比赛中,抓取捕捉组<br/>
并将它们放入数组中。在</p>