擅长:python、mysql、java
<pre><code>{"href" : re.compile(r"\/b-\d+.+(?!View\%20All)")}
{"href" : re.compile(r"^.+\/b-\d+.+(?!View\%20All$)")}
</code></pre>
<p>你哪里错了?在</p>
<p>当我们给出<code>(?!View\%20All)</code>时,它断言<code>View\%20All</code>不能紧跟前面的模式<code>.+</code>匹配</p>
<p>实际上,这意味着未来总是正确的</p>
<p>为了举例说明,让我们检查每个模式匹配的是什么</p>
<p><code>http://www.foo.com/bar/b-12312903?sName=View%20All</code></p>
<p><code>/b-</code>很明显</p>
<p><code>\d</code>匹配<code>12312903</code></p>
<p>现在问题出现了</p>
<p><code>.+</code>匹配任何使否定断言<code>(?!View\%20All)</code>成功的任何内容。在</p>
<p>也就是说</p>
<p><code>.</code>匹配<code>?s</code>未匹配的字符串是<code>sName=View%20All</code>,它与起始位置<code>s</code>的<code>(?!View\%20All)</code>不匹配,因此总是成功地匹配第1行和第2行</p>
<p><a href="http://regex101.com/r/aS5yS2/2" rel="nofollow">demo</a>以获得清晰的图像。在</p>
<p>修复??在</p>
<p>使用lookaround断言时,请修复检查开始的位置</p>
<p>比如说使用类似regex的</p>
^{pr2}$
<p>与3和4相匹配</p>
<p><a href="http://regex101.com/r/aS5yS2/1" rel="nofollow">http://regex101.com/r/aS5yS2/1</a></p>
<p>这里,<code>?</code>或{<cd16>}固定了否定断言开始的位置。在</p>