前言
无
一、JS正则
// 边界符号(一般用于精准匹配)
^ 以它开始
$ 以它结束
// 量词符号
* 重复0次或者更多次(可理解为乘法)
+ 重复1次或者更多次(可理解为加法)
? 重复0次或一次(可理解为三元表达式的?是否存在)
{n} 重复n次
{n, m} 重复n到m次
| 或者
RegExp对象
RegExp 对象用于将文本与一个模式匹配。
/ab+c/i; //字面量形式
new RegExp('ab+c', 'i'); // 首个参数为字符串模式的构造函数
new RegExp(/ab+c/, 'i'); // 首个参数为常规字面量的构造函数
二、实战
在一次做搜索高亮词的正则匹配时,遇到了无法正常转义特殊字符的情况。举个例子,当我在输入框逐字输入『青花瓷(周杰伦)』时,input框下会出现一系列的搜索sug词,此时我的正则匹配是这样的
let reg = RegExp(matching, 'i'); // matching是准备进行匹配的文本,这里只是简单的忽略了大小写,没有考虑到英文符号
const parts = text.split(reg);
当用户输入的是『青花瓷(周杰伦)』时,由于其中的英文括号没有经过转义影响到了正则匹配的规则,因此会出现报错的情况。stackoverflow中给出的解决办法如下:
// To escape the RegExp itself:
const escapeRegExp = str => {
return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string
};
let reg = RegExp(escapeRegExp(matching), 'i');
const parts = text.split(reg);
例如
escapeRegExp("All of these should be escaped: \ ^ $ * + ? . ( ) | { } [ ]");
>>> "All of these should be escaped: \\ \^ \$ \* \+ \? \. \( \) \| \{ \} \[ \] "