正则方法及常见代码题

21 阅读2分钟

match

  • 定义: match() 方法可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配
  • 语法: string.match(regexp)
  • 注意: match() 方法将检索字符串 String Object,以找到一个或多个与 regexp 匹配的文本。这个方法的行为在很大程度上有赖于 regexp 是否具有标志 g。如果 regexp 没有标志 g,那么 match() 方法就只能在 stringObject 中执行一次匹配。如果没有找到任何匹配的文本, match() 将返回 null。否则,它将返回一个数组,其中存放了与它找到的匹配文本有关的信息。
  • 代码题1
// 找出字符串中连续出现最多的字符和个数
// 'abcaakjbb' => {'a':2,'b':2}['aa','bb']
// 'abbkejsbcccwqaa' => {'c':3}
function findShowMostLetter(str = ''){
    let arr = str.match(/(\w)\1+/g)
    if(!arr){
        return {}
    }
    let res = {}
    let max = 1
    arr.forEach((item)=>{
        key = item[0]
        length = item.length
        if(length===max){
            res[key] =length
        }else if(length>max){
            res = {}
            res[key] = length
            max = length
        }
    })
    return res
}
  • 代码题2
// 提取浏览器 url 中的参数名和参数值,生成一个 key/value 的对象
// let str = 'https://m.yonghuivip.com/sit/yh-m-site/yh-newborn-zone/index.html?intercept=1&pageid=61e8085d8a0af900068f89b4&platform=ios&version=8.2.0&shopid=9131&needlogin=1'
// console.log(getUrlParamObj(str))
function getUrlParamObj(str){ 
    const pattern = /([^?&=]+)=[^&=]*/gi
    const res = str.match(pattern)
    let output = {}
    if(!res ||res.length === 0){
        return output
    }
    for(let i = 0; i<res.length; i++){
        let [key,value] = res[i].split('=')
        output[key] = value
    }
    return output
}

replace

  • 定义: replace() 方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串
  • 语法: string.replace(searchvalue,newvalue)
  • 入参: 该方法接受两个参数: 第一个参数可以是字符串,也可以是一个regExp对象,第二个参数可以是字符串也可以是一个函数,如果第一个函数是字符串,只会替换第一个子字符串
  • 第二个参数是字符串时,有以下几个特殊字符
    • 直接量符号(就是当 直接量符号(就是当做''字符用)
    • $& 与正则相匹配的字符串
    • $` 匹配字符串左边的字符
    • $’ 匹配字符串右边的字符
    • 1,1,2,,3,,,3,…,n 匹配结果中对应的分组匹配结果
  • 第二个参数是函数时,且只有一个匹配项时,接受三个参数match(匹配项),pos(匹配项在字符串中的位置),originalText(原始字符串)
  • 当正则表达式中定义了多个捕获组时,传递给函数的参数依次是模式的匹配项,第一个捕获组的匹配项,第二个捕获组的匹配项...,最后两个参数仍然是模式的匹配项在字符串中的位置和原始字符串
  • 代码题1
// console.log(numberFormat(12345678.90))
// 12,345,678.90
function numberFormat(number){
    if(toLocaleString){
        return number.toLocaleString()
    }else{
        return number.toString().replace(/\B(?=(\d{3})+(?!\d))/g,',')
    }
}
  • 代码题2
// 实现键值 下划线换成小驼峰
// const obj = { z_l: { z_s: '张三' }, l_s: '李四' }
function toCamelCase(obj){
    if(obj == null){
        return obj
    }
    let keys = Object.keys(obj)
    let res = {}
    for(let i=0; i<keys.length; i++){
        const newKey = keys[i].replace(/_(\w)/g,(match,$1)=>{
            return $1.toUpperCase()
        })
        if(typeof obj[keys[i]] === 'object'){
            console.log('==')
            res[newKey] = toCamelCase(obj[keys[i]])
        }else{
            res[newKey] = obj[keys[i]]
        }
        
    }
    return res
}
  • 代码题3
// 现字符串的 trim 函数,去除字符串两边的空格
function trim(str){
    return str..replace(/^\s*|\s*$/g,'')
}
function trim2(str){
    return str.replace(/^\s*(\w*)\s*$/g,'$1')
}
console.log(trim('    fff     '))
console.log(trim2('    fff     '))
  • 代码题4
// 将手机号 12988886666 转化成 129 8888 6666,或是129****6666
function revertTel(num){
    // return num.toString().replace(/(\d{3})(\d{4})(\d{4})/g, '$1 $2 $3')
    return num.toString().replace(/(?<=\d{3})(\d{4})(?=\d{4})/g, function(str,$1){
        console.log(str,$1)
        return '****'
    })
}

test()

  • 定义:test()方法搜索字符串指定的值,根据结果并返回真或假。
  • 代码题
const patt1=new RegExp("e");
document.write(patt1.test("The best things in life are free"));

exec()

  • 定义: exec() 方法检索字符串中的指定值。返回值是被找到的值。如果没有发现匹配,则返回 null。
  • 代码题
var patt1=new RegExp("e");
document.write(patt1.exec("The best things in life are free"));