排除前面有某个字符的正则表达式匹配

Posted

技术标签:

【中文标题】排除前面有某个字符的正则表达式匹配【英文标题】:Excluding regex matches that are preceded by a certain character 【发布时间】:2017-05-09 10:21:44 【问题描述】:

我有以下几点:

Regex urlRx = new Regex(@"((https?|ftp|file)\://|www.)[A-Za-z0-9\.\-]+(/[A-Za-z0-9\?\#\&\=;\+!'\(\)\*\-\._~%]*)*", RegexOptions.IgnoreCase);

这匹配所有 URL,但我想排除那些前面有字符 "' 的 URL。我一直在尝试使用其他解决方案 (Regex to exclude [ unless preceded by \) 来实现这一目标,但未能通过。

如果我有这个,我应该得到一个匹配:

The brown fox www.google.com

但是,如果我有这个:

The brown fox <a href="www.google.com">boo</a>

我不应该得到匹配,因为"。如何实现?

【问题讨论】:

【参考方案1】:

你需要一个消极的后视:在你的正则表达式前加上(?&lt;!["'])

解释:

(?&lt;!...) 表示:直接前面当前位置的东西不能匹配...["'] 只是一个字符组,包含您要排除的两个字符。

注意:在@"..." 字符串中,双引号通过将它们加倍来进行转义,因此您的代码将显示为:

Regex urlRx = new Regex(@"(?<![""'])((https?|ftp|file)...

在 VB 中:

Dim urlRx As New Regex("(?<![""'])((https?|ftp|file)...

【讨论】:

以上是关于排除前面有某个字符的正则表达式匹配的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式怎么匹配前面紧跟某个字符串的字符

mysql 正则表达式 查询匹配 某个词

当两边都被某个字符串包围时试图排除匹配

正则表达式

正则表达式排除特定字符串

使用正则表达式匹配模式后排除子字符串