JS使用正则从文本中提取所有的url

需求

有一段文本如下:

1
2
3
4
5
6
我是文本
![](https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fn.sinaimg.cn%2Ftranslate%2F620%2Fw910h510%2F20180429%2FfvFl-fzrwiaz1256884.jpg&refer=http%3A%2F%2Fn.sinaimg.cn&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1631068659&t=f21770640c21b19d6236c33ac13f77c3)

[点击下载](http:it.newban.cn)

![](https://cdn.jsdelivr.net/gh/songjianzaina/SavePicGoPic/img/20210106181201.png)

需要将里面所有的非图片url提取出来并替换

实现

  1. url提取代码如下:
1
2
3
4
5
6
7
8
9
10
11
 let allReg = new RegExp("[^!]\\[.*\\]\\((http.+)\\)", "g");

let result;
let allArr = [];
while ((result = urlReg.exec(data)) != null) {
getShortUrl(result[1], (value) => {

allArr.push(value)
});
}
// allArr里面装着所有匹配到的url
  1. url替换;
1
2
3
4
//比如将所有的链接替换成A
allArr.forEach(e=>{
data.replace(e,"A")
})

RegExp对象介绍

1
2
3
4
let reg=new RegExp("[^!]\\[.*\\]\\((http.+)\\)","g")

//或者简写成
let reg=/[^!]\\[.*\\]\\((http.+)\\)/g;

参数:

第一个参数填入正则表达式, 第二个参数填入正则修饰符,其中g表示全局匹配

正则表达式修饰符:
修饰符 描述
i 执行对大小写不敏感的匹配。
g 执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。
m 执行多行匹配。

常用方法:

使用String对象的match方法匹配多个:

1
2
let arr=data.match(reg);
//返回一个装有匹配到内容的数组

exec方法 用于匹配单个:

1
2
3
let reg=new RegExp("[^!]\\[.*\\]\\((http.+)\\)")
let element=reg.exec("http:xxxxx")
//返回第一个匹配到的内容

在不加第二个参数g的前提下, 重复执行exec方法, 始终返回第一个

如果加了g ,重复执行相当于遍历, 如下:

1
2
3
4
5
let reg=new RegExp("[^!]\\[.*\\]\\((http.+)\\)","g")
let element=reg.exec("http:xxxxx")
//返回第一个
let element2=reg.exec("http:xxxxx")
//返回第二个

test方法, 检查是否有符合匹配的存在:

1
2
let reg=new RegExp("[^!]\\[.*\\]\\((http.+)\\)","g")
let isHas=reg.test("http:xxx")//如果匹配上了返回ture 否则false

String对象的search方法也可以检查是否有符合匹配的存在:

1
2
let index=data.search(reg);
//index为-1表示没有匹配上 否则 匹配成功

示例

  1. url中提取子域名

    1
    2
    var url = "http://xxx.domain.com";
    console.log(/[^.]+/.exec(url)[0].substr(7)); // logs "xxx"
  2. 从一个单词中分离出Unicode 字符

    1
    2
    3
    4
    5
    6
    7
    8
    let text = "Образец text на русском языке";
    let regex = /[\u0400-\u04FF]+/g;

    let match = regex.exec(text);
    console.log(match[1]); // prints "Образец"

    let match2 = regex.exec(text);
    console.log(match2[1]); // prints "на" [did not print "text"]

使用前建议使用正则表达式测试工具验证正则表达式是否可行

本文为作者原创 转载时请注明出处 谢谢

B站入口

打赏通道

微信公众号二维码如下:

img

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

0%