我需要为黑名单创建正则表达式,该正则表达式接受所有 URL 变体 - http:// 或 https://(带或不带 www)。我想到了这个:
网址: https://www.example.com/contactus.aspx
正则表达式:
(https?:\/\/)?(www\.)?example\.com\/contactus\.aspx
我有数百个这样的 URL,所以大约一年前我创建了 Excel 公式来格式化它:
=CONCATENATE("(https?:\/\/)?(www\.)?",(SUBSTITUTE(SUBSTITUTE(IF(LEFT(MID(A2,FIND("//",A2)+2,LEN(A2)-FIND("//",A2)-1-(RIGHT(A2)="/")),4)="www.", RIGHT(MID(A2,FIND("//",A2)+2,LEN(A2)-FIND("//",A2)-1-(RIGHT(A2)="/")), LEN(MID(A2,FIND("//",A2)+2,LEN(A2)-FIND("//",A2)-1-(RIGHT(A2)="/")))-4), MID(A2,FIND("//",A2)+2,LEN(A2)-FIND("//",A2)-1-(RIGHT(A2)="/"))),"/","\/"),".","\.")))
它并不漂亮,但可以工作 - 有点。我刚刚注意到当 URL 包含 + 或 ? 时,它不会将字符转义为"\+" or "\?"
。
网址: http://example.com/Site/Find+The+Site.php?lang=en
正则表达式:
(https?:\/\/)?(www\.)?example\.com\/Site\/Find+The+Site\.php?lang=en
已经有一段时间了,我仍然不明白我当初是如何想出这个公式的——可能有更好的方法来做到这一点。
预期的正则表达式是:(https?:\/\/)?(www\.)?example\.com\/Site\/Find\+The\+Site\.php\?lang=en
我当前的解决方法是在运行公式之前处理 URL 以转义 + 和 ? =SUBSTITUTE(SUBSTITUTE(A2,"?","\?"),"+","\+")
。我想合并上面的 SUBSTITUTE,以便一个公式可以处理 www/http/https 和转义 +、?
答案1
如果我理解正确的话,你可以将你的SUBSTITUTE
公式包括在内:
="https?://(?:www\.)?" & MID(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE( I1,"/www.","/"),"+","\+"),".","\."),"?","\?"),FIND("//",I1)+2,999)
请注意,我没有逃脱固相线在正则表达式中。这是否必要取决于语言是否使用斜线作为模式分隔符。在 Excel VBA 正则表达式中,情况并非如此。在其他情况下,情况可能如此。因此,您可能需要添加另一个嵌套的SUBSTITUTE
,并进行一些其他细微更改,以解决此问题
例如:
="https?:\/\/(?:www\.)?" & MID(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE( I1,"/www.","/"),"/","\/"),"+","\+"),".","\."),"?","\?"),FIND("//",I1)+4,999)
给出你的网址,http://example.com/Site/Find+The+Site.php?lang=en
第一个公式将返回:
https?://(?:www\.)?example\.com/Site/Find\+The\+Site\.php\?lang=en
第二:
https?:\/\/(?:www\.)?example\.com\/Site\/Find\+The\+Site\.php\?lang=en