原来的需求是要把石墨文档的文件完全搬到本地,但是图片都在云端,就需要用正则表达式匹配到文档里的网络图片链接,然后弄下来并改文件夹为本地路径。
后面增加了想法,有没有一个正则表达式可以把任意网络文件中的网络图片地址都匹配出来,不管这文本有多乱,只要这个文本可能有意义。
折腾了一下应该是有办法的。
需求如下:
有如下乱七八糟的文本
图片1:
https://img.alicdn.com/imgextra/i3/194/TB22Vj0dwoQMeJjy0FoXXcShVXa_!!194-2-luban.png_120x120q90.jpg_.webp
MyPic1:http://img.shimo.com/pic/mypic/Jd7oOG9IjwwAnNU.png100*100.pngMyPic2:http://img.shimo.com/Jd7oOG9IjwwAnNU.png!thumbnail)
<img src = "https://img.alicdn.com/f/Jd7oOG9IjwAnNU7.png!thumbnail">
图片2:https://uploader.shimo.im/f/deuk64Z2MLcWI91O.png图片3:https://uploader.shimo.im/f/deuk64Z2MLcWI91O.png!thumbnail
https://www.baidu.comhttps://uploader.shimo.im/f/TIHc0HxMY4kUa.jpg.100*100.jpg
(https://uploader.shimo.im/f/deuk64Z2MLcW.png.500x500.png!thumbnail)
要匹配所有的网络图片链接,如下图
注意,如图片存储于本地如localfolder则不匹配
解决方案:
正则表达式:
(https?:[^:<>"]*\/)([^:<>"]*)(\.((png!thumbnail)|(png)|(jpg)|(webp)))
可以不断再往后增加可能的后缀类型,只要你想。
可以放到正则官网测试:RegExr: Learn, Build, & Test RegEx
测试结果:
注意,此方法不是基于html的,换句话说不依赖于img标签。
原理:
先找到http或者https标签,然后一直往右找,如果遇到 " < > : 这几个不能出现在文件名中的字符就停止(这里是因为避免两个链接在同一行,不加的话会把两个链接连一起匹配出来)。
然后找到最后一个 / 号,就可以获取左侧的网络前缀,这部分在下载后可以替换为本地路径。
然后往右侧尽可能的找,直到找到最后一个png或者jpg后缀为止。(注意这里png!thumbnail也是一种后缀,用于压缩后的图片)。
xxxx * 是正则表达式中的贪婪模式,此处尽可能往右找是因为有的网络图片以.png100*100.png为后缀,如果找到第一个"png"就停止了则没法获取完整文件名。
纠结:
但是如果像如下格式,整行都会被匹配上
新图片地址:https://img.alicdn.com/f/Jd7oOG9IjwAnN7.png!thumbnail,随手备份下我存在E盘里localfolder/mypic.png
但其实我只要前面的这串: https://img.alicdn.com/f/Jd7oOG9IjwAnN7.png!thumbnail
如果遇到这种情况怎么办呢?
我决定不钻牛角尖了,情况有千千万,还是要根据自己当前使用的情景写正则,没有哪个正则能适用哪怕某一类的所有场景。
甚至写代码的话经常用最简单的replace都行,反正只是个工具,快速解决需求才是关键的!