<p>像这样的怎么样</p>
<pre class="lang-regex prettyprint-override"><code>(https?:\/\/[a-z0-9]+(?:[\-\.]{1}[a-z0-9]+)*\.[a-z]{2,6})(?=https?)(\S+)
</code></pre>
<p>我们将使用<code>i</code>标志进行不区分大小写的搜索</p>
<p>在这里测试:<a href="https://regex101.com/r/J62XZq/2" rel="nofollow noreferrer">https://regex101.com/r/J62XZq/2</a></p>
<h3>说明</h3>
<ul>
<li><p><code>https?:\/\/</code>是查找<em>http://</em>或<em>https://</em></p>
</li>
<li><p><code>[a-z0-9]+(?:[\-\.]{1}[a-z0-9]+)*\.[a-z]{2,6}</code>是查找有效的域名。我没有检查它是否真的是完全防弹的。但这似乎并不坏。我们也许可以找到一个官方的正则表达式来验证域名。<code>(?:)</code>组是一个非捕获组(如果我们不需要它)</p>
</li>
<li><p><code>(https?:\/\/[a-z0-9]+(?:[\-\.]{1}[a-z0-9]+)*\.[a-z]{2,6})</code>同时在一起并在一个组中捕获,因此我们拥有原始URL</p>
</li>
<li><p><code>(?=https?)</code>是一个正向前瞻,因此前面的域后面必须跟有http或https。如果可以使用ftp或其他协议,则可能需要对其进行调整</p>
</li>
<li><p><code>(\S+)</code>是将非空格匹配一次或多次,并将其捕获到一个组中(以供以后使用和处理。必须处理第二个组,以便除去第二个查询字符串<code>?param=x&option</code>,该字符串可能属于周围的URL</p>
</li>
</ul>
<h3>编辑</h3>
<p>因为我们讨论了只匹配正确的答案,这意味着我的答案不是很好。要理解要做什么并不总是容易的</p>
<p><a href="https://regex101.com/r/J62XZq/7" rel="nofollow noreferrer">https://regex101.com/r/J62XZq/7</a></p>
<p>在这里,我们寻找一个域后面没有<code>http:</code>或<code>https:</code>的URL</p>
<p>诀窍是在开头添加<code>\b</code>,以避免与URL内的URL匹配,并在域后使用负前瞻</p>
<pre class="lang-regex prettyprint-override"><code>\bhttps?:\/\/[a-z0-9]+(?:[\-\.]{1}[a-z0-9]+)*\.[a-z]{2,6}(?!https?:)\/\S+\/next\?(\S+)
</code></pre>
<p>使用<code>(?!https?:)</code>完成了负前瞻(我没有添加双斜杠,因为我认为它已经足够了)</p>
<p>带有<code>/next</code>的最后一部分可能不是必需的。这取决于您是否希望将URL与内部URL具体匹配</p>