<p>本文中的<code>?</code>是重复运算符(<code>+</code>,<code>*</code>,和{<cd1>})上的一个特殊运算符。在可用的引擎中,这会导致重复出现<em>懒惰</em>或<em>非贪婪</em>或<em>不情愿</em>或其他类似术语。典型的重复是贪婪的,这意味着它应该尽可能匹配。因此,在大多数现代perl兼容引擎中有三种类型的重复:</p>
<pre><code>.* # Match any character zero or more times
.*? # Match any character zero or more times until the next match (reluctant)
.*+ # Match any character zero or more times and don't stop matching! (possessive)
</code></pre>
<p>更多信息可以在这里找到:<a href="http://www.regular-expressions.info/repeat.html#lazy" rel="nofollow">http://www.regular-expressions.info/repeat.html#lazy</a>表示不情愿/懒惰,这里:<a href="http://www.regular-expressions.info/possessive.html" rel="nofollow">http://www.regular-expressions.info/possessive.html</a>表示所有格(在这个答案中我将跳过讨论)。在</p>
<p>假设我们有字符串<code>aaaa</code>。我们可以用<code>/(a+)a/</code>匹配所有的a。实际上这是</p>
<blockquote>
<p>match one or more <code>a</code>'s followed by an <code>a</code>.</p>
</blockquote>
<p>这将匹配<code>aaaa</code>。regex是贪婪的,它将匹配尽可能多的<code>a</code>。第一个子匹配是<code>aaa</code>。在</p>
<p>如果我们使用regex <code>/(a+?)a</code>这是</p>
<blockquote>
<p><em>reluctantly</em> match one or more <code>a</code>s followed by an <code>a</code><br/>
<em>or</em><br/>
match one or more <code>a</code>s until we reach another <code>a</code></p>
</blockquote>
<p>我们只需要匹配。所以在本例中,匹配是<code>aa</code>,第一个子匹配是<code>a</code>。我们只需要匹配一个<code>a</code>来满足重复,然后它后面跟着一个<code>a</code>。在</p>
<p>当使用regex在html标记、引号等通常为<em>快速和脏</em>操作保留的类似方法中进行匹配时,会出现很多问题。也就是说,使用regex从非常大和复杂的html字符串或带转义序列的引号字符串中提取可能会导致很多问题,但对于特定的用例来说,这是非常合适的。因此,在您的案例中,我们有:</p>
^{pr2}$
<p>表达式需要匹配<code>videos/</code>,后跟零个或多个字符,后跟<code>/"</code>。如果只有一个视频网址在那里,这是很好的,而不是不情愿。在</p>
<p>但是我们有</p>
<pre><code>/videos/1610110089242029/" ... ajaxify="/Dev/videos/1610110089242029/"
</code></pre>
<p>毫无疑问,正则表达式将匹配:</p>
^{4}$
<p>它尽可能多地匹配,<code>/</code>和{<cd18>}满足<code>.</code>就可以了。由于不情愿,匹配会在第一个<code>/"</code>处停止(实际上它是回溯的,但您可以单独阅读)。因此,您只得到您需要的部分url。在</p>