禁止贪婪 +? 取一个 *? 取零
{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-04const 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-04const 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,3console.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-+])/gconst str = '123run456run-'console.log(str.match(reg)); // ["run", "run"]}
// (?<=exp2)exp1:查找 exp2 后面的 exp1。// exp1(?!exp2):查找后面不是 exp2 的 exp1。// (?<!exp2)exp1:查找前面不是 exp2 的 exp1。