正则表达式的基础知识4

107 阅读1分钟

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

m多行匹配修正符

下面的字符串,想匹配所有商品的数据,写了如下正则表达式,多个或没空格➕井号+数字+一个或多个空格+任意字符一个或者多个➕一个或多个空格➕井号+一个或多个空格,匹配结果并不如意,匹配了4条符合条件的,但是肉眼可以看到,第三个不符合条件,简单的区别是每一行都是以井号结束,第三行不是,那么问题来了,是不是可以按照每行来匹配字符串呢?

    var shi = `
    #1 js,200元 #
    #2 php,20000元 #
    #8 baidu.com  # 骚帮
    #3 node.js,10元 #
  `
    var reg = /\s*#\d\s+.+\s+#\s+/g
    console.log(shi.match(reg))
    // ['\n    #1 js,200元 #\n    ', '#2 php,20000元 #\n    ', '#3 baidu.com  # ', '\n    #4 node.js,10元 #\n  ']

答案是ok的,把每一行当成一个主体,问题就非常好处理了,直接判断是不是以井号结束就ok了

    var shi = `
    #1 js,200元 #
    #2 php,20000元 #
    #3 baidu.com  # 骚帮
    #4 node.js,10元 #
  `
    var reg = /.*#$/gm
    console.log(shi.match(reg))

精彩实例,将上面字符串的商品,提取出商品的名称和价格。用上面的方法匹配到字符串,然后掐头去尾,只留中间部分,然后split一分为2,然后解构就可以获取到第一个是商品名称,第二个是商品价格

  var shi = `
    #1 js,200元 #
    #2 php,20000元 #
    #3 baidu.com  # 骚帮
    #4 node.js,10元 #
  `
    var reg = /.*#$/gm
    console.log(shi.match(reg).map(v => {
        v = v.replace(/\s*#\d+\s/, "").replace(/\s+#/, '');
        const [
            name,
            price
        ] = v.split(',')
        return {
            name,
            price
        }
    }))

exce

exce方法,返回匹配的字符,并且记录当前匹配的位置,下一次匹配会在这个位置开始查找下一个匹配,必须是在g模式下才遵守这个规则,否则每次只匹配第一个匹配,有点类似generator函数,可以利用while循环遍历

    var shi = "shi";
    var reg = /\w/g
    console.log(reg.exec(shi))
    console.log(reg.exec(shi))
    console.log(reg.exec(shi))
    console.log(reg.exec(shi))

遍历代码如下

    var shi = "shi";
    var reg = /\w/g;
    var a = null;
    while (a = reg.exec(shi)) {
        console.log(a)
    }