正则表达式的基础知识6

81 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第28天,点击查看活动详情

原子组引用完成替换操作

如下,想用在字符串中,将h标签替换成p标签,可以使用分组引用来完成,首先正则表达式中使用引用可以使用\1 \2 ...,然后在replace第二个参数中可以使用11 2 ...(分别表示第一个分组的值,第二分组匹配的值)

   let shi = `
    <h1>shizebang</h1>
    <h3>dashabi</h3>
    <span>shizengbang</span>
    `
    let reg = /<(h[1-6])>([\s\S])<\/\1>/ig;
    console.log(shi.replace(reg, `<p>$2</p>`))

replace第二个参数是函数时,匹配的引用会当成参数传入,第一个参数是匹配正则规则的原字符串,第二个是第一个分组,第三个是第二个分组,按照正则表单式中小括号的顺序来区分分组的序号

    let shi = `
    <h1>shizebang</h1>
    <h3>大舔狗</h3>
    <span>shizengbang</span>
    `
    let reg = /<(h[1-6])>(\w?([\s\S]+))<\/\1>/ig;
    shi=shi.replaceAll(reg, (target, p1, p2, p3) => {
        console.log(p1,22);
        return `<p>${p3}</p>`
    })
    console.log(shi)

嵌套分组和不记录分组

假设产品要求写个正则匹配一下域名,就是不想看到分组中有com\org\cn,也就是只想显示下面例子中的第一个分组

    let shi = `
   https://www.xiaoshitou.com
    `
    let reg = /https:\/\/(\w+\.\w+\.(com|org|cn))/i;
    console.dir(shi.match(reg))

image.png 上面结果是不符合预期的,就想不记录分组怎么办呢?在括号内的前面加上?:,就是表示忽略这个分组,结果中就不会将这个分组记入

    let shi = `
   https://www.xiaoshitou.com
    `
    let reg = /https:\/\/(\w+\.\w+\.(?:com|org|cn))/i;
    console.dir(shi.match(reg))

image.png

在上面的基础上,情况变的有些复杂,有些域名可能没有www.,有些可能只是http,复杂嵌套,道理一样,把忽略的分组前面加上?:,再利用exec的特性配合while循环,就可以获取到所有匹配的域名了。

let shi = `
   https://www.xiaoshitou.com
   http://xiaoshitou.com
   https://shi.com
    `
    let reg = /https?:\/\/((?:\w+\.)?\w+\.(?:com|org|cn))/ig;
    let urls = [];
    while (res = reg.exec(shi)) {
        urls.push(res[1])
    }
    console.log(urls)