Skip to content

Latest commit

 

History

History
101 lines (82 loc) · 3.3 KB

3.12 有趣的正则表达式.md

File metadata and controls

101 lines (82 loc) · 3.3 KB
问题:将"/test/info?page={page}&limit={limit}"这段地址中的大括号中的page和limit替换成字典中的数值。

方案一:

const targetUrl = '/test/info?page={page}&limit={limit}'

const params = {
    page: 1,
    limit: 10
}

const replace1 = (url, params) => {
    let firstIndex = url.indexOf('?');
    let resultUrl=url;

    if (firstIndex != -1) {
        //先取到后面一段
        let result = url.slice(firstIndex + 1); // 得到 'page={page}&limit={limit}'
        let items = result.split('&'); 		//得到['page={page}','limit={limit}']
        items.forEach(item => {
            let dic = item.split('='); // 对于Page来说,得到['page','{page}']
            let key=dic[0];			// key的值为 'page'
            resultUrl=resultUrl.replace('{'+key+'}',params[key]); //进行替换
        });        
    }
    return resultUrl
}

方案二:匹配得到被{}的文本,将其替换成我们的参数。(其实我感觉这个方案才是我们无脑想到的

const regex0=(url,params)=>{
    let resultUrl = url;
    //就是{}开头结尾来得到数值
    // \w+匹配数字和字母下划线的多个字符。也可以写成[\w]+
    // [\w+]表示匹配数字、字母、下划线和加号本身字符;
    let regex=/\{\w+\}/g   
    let matter=url.match(regex);	// 得到['page={page}','limit={limit}']
    console.log(matter);

    if(matter && matter.length){
        matter.forEach(item=>{
            //这里我们知道,我们得到的是包含有{}的字符串.需要将这个符号去掉
            let temp = item.slice(1,item.length-1);
            console.log(temp);
            resultUrl= resultUrl.replace(item,params[temp]);
        })
    }
    return resultUrl;
}

方案三:加上条件原则,再来一个正则(这个感觉就比较舒服…也值得学习)

const regex2=(url,params)=>{
    let resultUrl = url;
    //以{开头,匹配结果在{之后,以}结尾,匹配结果在}之前
    //(?=exp) :定义目标字符串结束位置要求,即紧随目标字符串后面出现的字符串需要匹配上exp表达式,该字符串不会被计入目标字符串,表达中出现的括号也不会被视作一个分组;
	//(?<=exp):定义目标字符串起始位置要求,即紧邻目标字符串前面出现的字符串需要匹配上exp表达式,该字符串不会被计入目标字符串,表达中出现的括号也不会被视作一个分组;
    let regex=/(?<=\{)\w+(?=\})/g
    let matter=url.match(regex);
    console.log(matter);

    if(matter && matter.length){
        matter.forEach(item=>{
            //这里得到的item,就是去掉{}之后的值
            console.log('item='+item);
            resultUrl= resultUrl.replace('{'+item+'}',params[item]);
        })
    }
    return resultUrl;
}

方案四:匹配规则更改成不以{开头,用}结尾的字符串

const regex3=(url,params)=>{
    let resultUrl = url;
    //匹配规则更改成不以{开头,用}结尾的字符串
    let regex=/[^{]\w+(?=\})/g
    let matter=url.match(regex);
    console.log(matter);

    if(matter && matter.length){
        matter.forEach(item=>{
            console.log('item='+item);
            resultUrl= resultUrl.replace('{'+item+'}',params[item]);
        })
    }
    return resultUrl;
}