前提

最近在 utools 上写了一个插件。
然后今天在 B站 捡到了一些好玩的(苏婆发丝特恰精),但是 UP主发的网盘链接为了躲避检测?进行了大量的添加。
image.png

刚好我做的插件就是相关的功能,于是准备对这串文字做点处理,达到自动提取出链接和提取码的功能。

插件细节不谈,今天谈谈本文的重点: 正则表达式

附 正则测试网站: https://regex101.com/

一、匹配 URL

(https?|ftp|file)://[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]

这个正则刚发现的时候,一度被我认为是最牛的。但在后面的测试中,我发现匹配不了一些我想要的
image.png

图中,无法单纯匹配域名,而且最后一个无效域名也被算进其中。

二、匹配域名

/[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+\\.?/g

这个属于玄学范畴了
image.png

在插件中一直发挥了匹配域名的作用
但是现在,不管我怎么测试,都匹配不到了

三、全都匹配

为了达到我的目标:既能匹配域名,又能匹配 url ,我决定在第一个的基础上修改一下,看能不能达到效果。

  1. 首先,去掉 http/https 的必须性
    ((https?|ftp|file):\/\/)?[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]
    这下只要是字母啥的都给你匹配上了
    image.png

  2. 其次,要求在后面的域名匹配中至少有一个点
    /((https?|ftp|file):\/\/)?(\.)+[-A-Za-z0-9+&@#\/%?=~_|!:,.;]+[-A-Za-z0-9+&@\/#%=~_|]/g
    点是保证了,但是那个点挡住了最前面的匹配
    image.png

  3. 最后,根据域名的规则,在前面再加上一串就可以了
    /((https?|ftp|file):\/\/)?[-a-zA-Z0-9]+(\.)+[-A-Za-z0-9+&@#\/%?=~_|!:,.;]+[-A-Za-z0-9+&@\/#%=~_|]/g
    image.png

到此,一个我心目中完美的正则表达式就出来了。

四、回顾

字符描述
*匹配前面的子表达式零次或多次。
+匹配前面的子表达式一次或多次。
.匹配除换行符 \n 之外的任何单字符。
?匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。
^匹配输入字符串的开始位置,除非在方括号表达式中使用,当该符号在方括号表达式中使用时,表示不接受该方括号表达式中的字符集合。
$匹配输入字符串的结尾位置。

五、附录

有域名的也是可以的http://www.shenlohfn.com
后面有斜杠 http://www.sdkuwdf/com/rpc/
有个问题 dajidhaiufafla
后面有斜杠 http://www.sdkuwdf/com/rpc/spedding
ip地址 http://12.343.54.78/test.html
前面有空格 http://dauh.o.com/files/xml-rpc.net.2.2.0.zip,没问题
带参数: http://www.regexbuddy.com/indx.html/?source=library没问题
单纯域名 www.baidu.com
斜杠干扰一下 //www.baidu.com
有点问题 https://something