日常使用的正则表达式,都是写死的,但有的时候需要根据不同数据动态生成正则。
比如,一个text字符串“今天是[星期三],[星期三]是晴朗的一天”,其中“[星期三]”在存储数据时候,要用Wednesday代替,注意关键词有一个[]。
1、正常str的replace写法是,只能替换一个
const text = "今天是[星期三],[星期三]是晴朗的一天"
const replaceText = text.replace("[星期三]", "Wednesday");
2、但是要全部替换,得这么写,因为属于特俗符号[],直接写正则/[星期三]/g,是不生效的。
const text = "今天是[星期三],[星期三]是晴朗的一天"
const replaceText = text.replace(/\[星期三\]/g, "Wednesday");
3、星期有7天,所以星期三是个动态变量,有可能是星期四、星期五,我们的replace不可能每一个星期都写一遍,所以理论上new一个正则对象就可以。
const week = "[星期三]"
const text = `今天是${week},${week}是晴朗的一天`
const regexp = new RegExp(week , "g");
// 此时的正则为:/[星期三]/g
const replaceText = text.replace(regexp, "Wednesday");
实际上,这个是失败的,原因就在于第2条,其中有特殊符号,此时生成的正则表达式是,实际上无法匹配到特殊符号。
/[星期三]/g
4、其中关键点就在符号[]的处理上,想要正确的表达式,需要生成的regexp中特殊符号"[","]"前面需要有一个标记"\"符号(使其失去原有的特殊含义,变为普通字符进行匹配),所以先处理这个符号。
const week = "[星期三]"
// 此时regWeek的结果为:\[星期三\]
const regWeek = week.replace(/\[/g, "\\[").replace(/\]/g, "\\]");
// 此时的正则表达式结果是:/\[星期三\]/g
const regexp = new RegExp(regWeek, "g");
const text = "今天是[星期三],[星期三]是晴朗的一天"
const replaceText = text.replace(regexp, "Wednesday");
// replaceText的结果是:今天是Wednesday,Wednesday是晴朗的一天