正则匹配整理

知识储备

exp1(?=exp2)
前瞻:查找exp2前面的exp1
(?<=exp2)exp1
后顾:查找exp2后面的exp1
exp1(?!exp2)
负前瞻:查找后面不是exp2的exp1
(?<!=exp2)exp1
负后顾:查找前面不是exp2的exp1
() 表示捕获分组,()会把每个分组里的匹配的值保存起来,使用$n(n是一个数字,表示第n个捕获组的内容)
(?:)表示非捕获分组,非捕获分组匹配的值不会保存起来
匹配本身需添加斜杠转移的特殊字符: $ ( ) * + . [ ? \ ^ { |

1.截取html片段里,双闭合标签中的内容

var htmlStr = "<p>p标签的内容Hello</p><h2>h2标签的内容World</h2>";
// 匹配【>】后【</】前的中英文及数字
var result = htmlStr.match(/(?<=>)[\u4e00-\u9fa5a-zA-Z0-9]+(?=<\/)/g)
// result -> ["p标签的内容Hello", "h2标签的内容World"]

注:若需匹配更丰富的字符,请按需添加匹配规则至字符簇中,如空格标点符号[\s,.=]等等。

2.查找字符串中子串,并加工拼接

"他是大名鼎鼎的金角大王".replace(/(.+是).*的(.+)/,'$1$2');
// "他是金角大王"
"奶奶养的小猫是安静可爱黏人的小摩卡".replace(/(.+)是.*的(.+)/,'$1的名字是$2');
// "奶奶养的小猫的名字是小摩卡"

3.隐藏手机号中间四位

"13312345678".replace(/^(\d{3})\d{4}(\d{4})$/,'$1****$2');
// "133****5678"

4.日期年月日换位

"2018-10-18".replace(/^(\d+)[^\d]+(\d+)[^\d]+(\d+)$/,'$2-$3-$1');
"2018_10_18".replace(/^(\d+)[^\d]+(\d+)[^\d]+(\d+)$/,'$2-$3-$1');
// "10-18-2018"

5.按条件查询’谁好谁坏’

var guys = 'A坏B好C坏D好E好F坏YY坏ZZZ好'.match(/(?<=^|好|坏)[^好坏]*?(?=好|坏)/g)
// ["A", "B", "C", "D", "E", "F", "YY", "ZZZ"]
var badGuys = 'A坏B好C坏D好E好F坏YY坏ZZZ好'.match(/(?<=^|好|坏)[^好坏]*?(?=坏)/g)
// ["A", "C", "F", "YY"]
var goodGuys = 'A坏B好C坏D好E好F坏YY坏ZZZ好'.match(/(?<=^|好|坏)[^好坏]*?(?=好)/g)
// ["B", "D", "E", "ZZZ"]

思路解析
所有想要查询的对象,都分布在【开头】与【好】或【坏】之间,以及【好坏】两字之间,查询【好坏】间不包含【好/坏】的子串即可

6.截取地址栏参数

function getQuery(key){
	let url = location.href;
	let res=url.match(eval('/(?<=[?|&]{1}'+key+'=).*?(?=&|$)/g'));
	if(res.length){
		res = res[0]
	}else{
		res = '';
	}
	return res;
}
// http://www.foo.com?pwd=asdf&user=admin&token=test&from=mine
// getQuery(token) -> test

思路解析
1.获取地址栏
2.截取地址栏字符串【?】或【&】后面匹配预期key的【=】后面,至下一个【&】或字符串末尾【$】前的内容,即为key对应的查询value值

7.截取相邻相同字符串

let str="aaaabbCCCCCCCC";
let list = str.match(/(\w)\1*/g);
// ["aaaa", "bb", "CCCCCCCC"]

思路解析
\1 \2 \n 代表()中截取到的内容

8.截取’138’后面的数字

var tel = '13800303313884513888812';
var list = tel.match(/(?<=138)\d*?(?=138|$)/ig)
// ["003033", "845", "88812"]

参考资料:https://blog.csdn.net/csm0912/article/details/81206848

展开阅读全文

没有更多推荐了,返回首页