禁止贪婪 +? 取一个 *? 取零
{
const str = "abbbb";
const reg = /ab+?/ig;
const reg2 = /ab*?/ig;
console.log(str.match(reg)); // ['ab']
console.log(str.match(reg2)); // ['a']
}
原子表 []
- + 在原子表[]中指的就是字符串 + ,不需要进行转义
- + 在外面指的是匹配一次到多次
{
const str = "abcde+.";
const reg = /[a+]/ig;
console.log(str.match(reg)); // ["a", "+"]
}
多个正则匹配
由字母数字4-8位且必须包含大写字母
{
const str = "cdw1X";
const reg = [
/^[a-z0-9]{4,8}$/gi,
/[A-Z]/g
]
const status = reg.every(item => item.test(str))
console.log(status);// true
}
$’ $& $`
- $` 匹配到的前面的内容
- $& 匹配到的内容
- $’ 匹配到的后面的内容
{
const str = "锄禾日当午";
const reg = /日/i;
console.log(str.replace(reg, "$`$&$'")); // 锄禾锄禾日当午当午
const str = "锄禾日当午";
const reg = /锄禾/i;
console.log(str.replace(reg, "<div>$&</div>")); // <div>锄禾</div>日当午
}
原子组 ()
从左向右第一个原子组 正则中使用 \1 表示
在 replace 方法中第二个参数是字符串情况下 $1 表示,
在 replace 方法中第二个参数是函数情况下 第二个参数即是原子组1
{
// 20230204 -> 2023-02-04
const str = "20230204";
const reg = /(\d{4})(\d{2})(\d{2})/gi;
console.log(str.match(reg));
console.log(str.replace(reg, "$1-$2-$3")); // 2023-02-04
const str = `<h1>oooo</h1><span>span</span>`;
const reg = /<(h[1-6])>([\s\S]+)<\/\1>/gi;
// console.log(22, str.replace(reg, '<p>$2</p>')); // <p>oooo</p><span>span</span>
// <p>oooo</p><span>span</span>
// 第一个参数匹配的值 第二个参数指的是原子组1 类推2,3
console.log(22, str.replace(reg, (...b) => {
console.log('b', b);
return `<p>${b[2]}</p>`
}));
}
取消原子组副作用(即不记录原子组) ?:
{
const str = "锄禾日当午";
const reg = /(日)/i;
console.log(str.replace(reg, "$1")); // 锄禾日当午
const str = "锄禾日当午";
const reg = /(?:日)/i;
console.log(str.replace(reg, "$1")); // 锄禾$1当午
const str = `<h1>锄禾日当午</h1>`;
const reg = /<(h[1-6])>(.*?)<\/(h[1-6])>/gi;
console.log(str.replace(reg, "<div>$2</div>"));
}
原子组别名
{
const str = `<h1>锄禾日当午</h1>`;
const reg = /<(h[1-6])>(?<con>.*?)<\/\1>/gi;
console.log(str.replace(reg, "<div>$<con></div>"));
}
?=
exp1(?=exp2):查找 exp2 前面的 exp1。
{
const reg = /run(?=[\d-+])/g
const str = '123run456run-'
console.log(str.match(reg)); // ["run", "run"]
}
// (?<=exp2)exp1:查找 exp2 后面的 exp1。
// exp1(?!exp2):查找后面不是 exp2 的 exp1。
// (?<!exp2)exp1:查找前面不是 exp2 的 exp1。