[TOC]

基础知识

houdunren.com (opens new window)@ 向军大叔
正则表达式是用于匹配字符串中字符组合的模式,在 JavaScript中,正则表达式也是对象。

  • 正则表达式是在宿主环境下运行的,如js/php/node.js 等
  • 本章讲解的知识在其他语言中知识也是可用的,会有些函数使用上的区别

    #对比分析

    与普通函数操作字符串来比较,正则表达式可以写出更简洁、功能强大的代码。
    下面使用获取字符串中的所有数字来比较函数与正则的差异。
    let hd = “houdunren2200hdcms9988”;
    let nums = […hd].filter(a => !Number.isNaN(parseInt(a)));
    console.log(nums.join(“”));
    使用正则表达式将简单得多
    let hd = “houdunren2200hdcms9988”;
    console.log(hd.match(/\d/g).join(“”));

    #创建正则

    JS提供字面量与对象两种方式创建正则表达式

    #字面量创建

    使用//包裹的字面量创建方式是推荐的作法,但它不能在其中使用变量
    let hd = “houdunren.com”;
    console.log(/u/.test(hd));//true
    下面尝试使用 a 变量时将不可以查询
    let hd = “houdunren.com”;
    let a = “u”;
    console.log(/a/.test(hd)); //false
    虽然可以使用 eval 转换为js语法来实现将变量解析到正则中,但是比较麻烦,所以有变量时建议使用下面的对象创建方式
    let hd = “houdunren.com”;
    let a = “u”;
    console.log(eval(/${a}/).test(hd)); //true

    #对象创建

    当正则需要动态创建时使用对象方式
    let hd = “houdunren.com”;
    let web = “houdunren”;
    let reg = new RegExp(web);
    console.log(reg.test(hd)); //true
    根据用户输入高亮显示内容,支持用户输入正则表达式

    houdunren.com



    通过对象创建正则提取标签

    houdunren.com


    hdcms.com


## [#](https://doc.houdunren.com/js/14%20%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F.html#%E5%85%83%E5%AD%90%E5%AD%97%E7%AC%A6)元子字符 元字符是正则表达式中的最小元素,只代表单一(一个)字符 ### [#](https://doc.houdunren.com/js/14%20%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F.html#%E5%AD%97%E7%AC%A6%E5%88%97%E8%A1%A8)字符列表 | **元字符** | **说明** | **示例** | | --- | --- | --- | | \\d | 匹配任意一个数字 | [0-9] | | \\D | 与除了数字以外的任何一个字符匹配 | [^0-9] | | \\w | 与任意一个英文字母,数字或下划线匹配 | [a-zA-Z_] | | \\W | 除了字母,数字或下划线外与任何字符匹配 | [^a-zA-Z_] | | \\s | 任意一个空白字符匹配,如空格,制表符\\t,换行符\\n | [\\n\\f\\r\\t\\v] | | \\S | 除了空白符外任意一个字符匹配 | [^\\n\\f\\r\\t\\v] | | . | 匹配除换行符外的任意字符 | | ### [#](https://doc.houdunren.com/js/14%20%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F.html#%E4%BD%BF%E7%94%A8%E4%BD%93%E9%AA%8C)使用体验 匹配任意数字
let hd = "houdunren 2010";
console.log(hd.match(/\d/g)); //["2", "0", "1", "0"]
匹配所有电话号码
let hd = `
张三:010-99999999,李四:020-88888888
`; let res = hd.match(/\d{3}-\d{7,8}/g);
console.log(res);
获取所有用户名
let hd = `
张三:010-99999999,李四:020-88888888`;
let res = hd.match(/[^:\d-,]+/g);
console.log(res);
匹配任意非数字
console.log(/\D/.test(2029)); //false
匹配字母数字下划线
let hd = "hdcms@";
console.log(hd.match(/\w/g)); //["h", "d", "c", "m", "s"]
匹配除了字母,数字或下划线外与任何字符匹配
console.log(/\W/.test("@")); //true
匹配与任意一个空白字符匹配
console.log(/\s/.test(" ")); //true
console.log(/\s/.test("\n")); //true
匹配除了空白符外任意一个字符匹配
let hd = "hdcms@";
console.log(hd.match(/\S/g)); //["2", "0", "1", "0","@"]
如果要匹配点则需要转义
let hd = `houdunren@com`;
console.log(/houdunren.com/i.test(hd)); //true
console.log(/houdunren\.com/i.test(hd)); //false
使用.匹配除换行符外任意字符,下面匹配不到hdcms.com 因为有换行符
const url = `
https://www.houdunren.com
hdcms.com
`;
console.log(url.match(/.+/)[0]);
使用/s视为单行模式(忽略换行)时,. 可以匹配所有
let hd = `

houdunren
hdcms

`;
let res = hd.match(/.*<\/span>/s);
console.log(res[0]);
正则中空格会按普通字符对待
let tel = `010 - 999999`;
console.log(/\d+-\d+/.test(tel)); //false
console.log(/\d+ - \d+/.test(tel)); //true ### [#](https://doc.houdunren.com/js/14%20%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F.html#%E6%89%80%E6%9C%89%E5%AD%97%E7%AC%A6)所有字符 可以使用 [\s\S] 或 [\d\D] 来匹配所有字符
let hd = `

houdunren
hdcms

`;
let res = hd.match(/[\s\S]+<\/span>/);
console.log(res[0]); ## [#](https://doc.houdunren.com/js/14%20%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F.html#%E6%A8%A1%E5%BC%8F%E4%BF%AE%E9%A5%B0)模式修饰 正则表达式在执行时会按他们的默认执行方式进行,但有时候默认的处理方式总不能满足我们的需求,所以可以使用模式修正符更改默认方式。 | **修饰符** | **说明** | | --- | --- | | i | 不区分大小写字母的匹配 | | g | 全局搜索所有匹配内容 | | m | 视为多行 | | s | 视为单行忽略换行符,使用. 可以匹配所有字符 | | y | 从 regexp.lastIndex 开始匹配 | | u | 正确处理四个字符的 UTF-16 编码 | ### [#](https://doc.houdunren.com/js/14%20%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F.html#i)i 将所有houdunren.com 统一为小写
let hd = "houdunren.com HOUDUNREN.COM";
hd = hd.replace(/houdunren\.com/gi, "houdunren.com");
console.log(hd); ### [#](https://doc.houdunren.com/js/14%20%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F.html#g)g 使用 g 修饰符可以全局操作内容
let hd = "houdunren";
hd = hd.replace(/u/, "@");
console.log(hd); //没有使用 g 修饰符是,只替换了第一个 let hd = "houdunren";
hd = hd.replace(/u/g, "@");
console.log(hd); //使用全局修饰符后替换了全部的 u ### [#](https://doc.houdunren.com/js/14%20%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F.html#m)m 用于将内容视为多行匹配,主要是对 ^和 $ 的修饰
将下面是将以 #数字开始的课程解析为对象结构,学习过后面讲到的原子组可以让代码简单些
let hd = `
#1 js,200元 #
#2 php,300元 #
#9 houdunren.com # 后盾人
#3 node.js,180元 #
`;
// [{name:'js',price:'200元'}]
let lessons = hd.match(/^\s*#\d+\s+.+\s+#$/gm).map(v => {
v = v.replace(/\s*#\d+\s*/, "").replace(/\s+#/, "");
[name, price] = v.split(",");
return { name, price };
});
console.log(JSON.stringify(lessons, null, 2)); ### [#](https://doc.houdunren.com/js/14%20%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F.html#u)u 每个字符都有属性,如L属性表示是字母,P 表示标点符号,需要结合 u 模式才有效。其他属性简写可以访问 [属性的别名 (opens new window)](https://www.unicode.org/Public/UCD/latest/ucd/PropertyValueAliases.txt)网站查看。
//使用\p{L}属性匹配字母
let hd = "houdunren2010.不断发布教程,加油!";
console.log(hd.match(/\p{L}+/u)); //使用\p{P}属性匹配标点
console.log(hd.match(/\p{P}+/gu));
字符也有unicode文字系统属性 Script=文字系统,下面是使用 \p{sc=Han} 获取中文字符 han为中文系统,其他语言请查看 [文字语言表(opens new window)](http://www.unicode.org/standard/supported.html)
let hd = `
张三:010-99999999,李四:020-88888888`;
let res = hd.match(/\p{sc=Han}+/gu);
console.log(res);
使用 u 模式可以正确处理四个字符的 UTF-16 字节编码
let str = "𝒳𝒴";
console.table(str.match(/[𝒳𝒴]/)); //结果为乱字符"�" console.table(str.match(/[𝒳𝒴]/u)); //结果正确 "𝒳" ### [#](https://doc.houdunren.com/js/14%20%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F.html#lastindex)lastIndex RegExp对象lastIndex 属性可以返回或者设置正则表达式开始匹配的位置 - 必须结合 g 修饰符使用 - 对 exec 方法有效 - 匹配完成时,lastIndex 会被重置为0 let hd = `后盾人不断分享视频教程,后盾人网址是 houdunren.com`;
let reg = /后盾人(.{2})/g;
reg.lastIndex = 10; //从索引10开始搜索
console.log(reg.exec(hd));
console.log(reg.lastIndex); reg = /\p{sc=Han}/gu;
while ((res = reg.exec(hd))) {
console.log(res[0]);
} ### [#](https://doc.houdunren.com/js/14%20%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F.html#y)y 我们来对比使用 y 与g 模式,使用 g 模式会一直匹配字符串
let hd = "udunren";
let reg = /u/g;
console.log(reg.exec(hd));
console.log(reg.lastIndex); //3
console.log(reg.exec(hd));
console.log(reg.lastIndex); //3
console.log(reg.exec(hd)); //null
console.log(reg.lastIndex); //0
但使用y 模式后如果从 lastIndex 开始匹配不成功就不继续匹配了
let hd = "udunren";
let reg = /u/y;
console.log(reg.exec(hd));
console.log(reg.lastIndex); //1
console.log(reg.exec(hd)); //null
console.log(reg.lastIndex); //0
因为使用 y 模式可以在匹配不到时停止匹配,在匹配下面字符中的qq时可以提高匹配效率
let hd = `后盾人QQ群:11111111,999999999,88888888
后盾人不断分享视频教程,后盾人网址是 houdunren.com`; let reg = /(\d+),?/y;
reg.lastIndex = 7;
while ((res = reg.exec(hd))) console.log(res[1]); ## [#](https://doc.houdunren.com/js/14%20%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F.html#%E5%8E%9F%E5%AD%90%E8%A1%A8)原子表 在一组字符中匹配某个元字符,在正则表达式中通过元字符表来完成,就是放到[] (方括号)中。 ### [#](https://doc.houdunren.com/js/14%20%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F.html#%E4%BD%BF%E7%94%A8%E8%AF%AD%E6%B3%95)使用语法 | **原子表** | **说明** | | --- | --- | | [] | 只匹配其中的一个原子 | | [^] | 只匹配"除了"其中字符的任意一个原子 | | [0-9] | 匹配0-9任何一个数字 | | [a-z] | 匹配小写a-z任何一个字母 | | [A-Z] | 匹配大写A-Z任何一个字母 | ### [#](https://doc.houdunren.com/js/14%20%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F.html#%E5%AE%9E%E4%BE%8B%E6%93%8D%E4%BD%9C)实例操作 使用[]匹配其中任意字符即成功,下例中匹配ue任何一个字符,而不会当成一个整体来对待
const url = "houdunren.com";
console.log(/ue/.test(url)); //false
console.log(/[ue]/.test(url)); //true
日期的匹配
let tel = "2022-02-23";
console.log(tel.match(/\d{4}([-\/])\d{2}\1\d{2}/));
获取0~3间的任意数字
const num = "2";
console.log(/[0-3]/.test(num)); //true
匹配a~f间的任意字符
const hd = "e";
console.log(/[a-f]/.test(hd)); //true
顺序为升序否则将报错
const num = "2";
console.log(/[3-0]/.test(num)); //SyntaxError
字母也要升序否则也报错
const hd = "houdunren.com";
console.log(/[f-a]/.test(hd)); //SyntaxError
获取所有用户名
let hd = `
张三:010-99999999,李四:020-88888888`;
let res = hd.match(/[^:\d-,]+/g);
console.log(res);
原子表中有些正则字符不需要转义,如果转义也是没问题的,可以理解为在原子表中. 就是小数点
let str = "(houdunren.com)+";
console.table(str.match(/[().+]/g)); //使用转义也没有问题
console.table(str.match(/[\(\)\.\+]/g));
可以使用 [\s\S] 或 [\d\D]匹配到所有字符包括换行符
...
const reg = /[\s\S]+/g;
...
下面是使用原子表知识删除所有标题

后盾人


houdunren.com


hdcms.com



## [#](https://doc.houdunren.com/js/14%20%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F.html#%E5%8E%9F%E5%AD%90%E7%BB%84)原子组 - 如果一次要匹配多个元子,可以通过元子组完成 - 原子组与原子表的差别在于原子组一次匹配多个元子,而原子表则是匹配任意一个字符 - 元字符组用 () 包裹 下面使用原子组匹配 h1 标签,如果想匹配 h2 只需要把前面原子组改为 h2 即可。
const hd = `

houdunren.com

`;
console.log(/<(h1)>.+<\/\1>/.test(hd)); //true ### [#](https://doc.houdunren.com/js/14%20%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F.html#%E5%9F%BA%E6%9C%AC%E4%BD%BF%E7%94%A8)基本使用 没有添加 g 模式修正符时只匹配到第一个,匹配到的信息包含以下数据 | **变量** | **说明** | | --- | --- | | 0 | 匹配到的完整内容 | | 1,2.... | 匹配到的原子组 | | index | 原字符串中的位置 | | input | 原字符串 | | groups | 命名分组 | 在match中使用原子组匹配,会将每个组数据返回到结果中 - 0 为匹配到的完成内容 - 1/2 等 为原子级内容 - index 匹配的开始位置 - input 原始数据 - groups 组别名 let hd = "houdunren.com";
console.log(hd.match(/houdun(ren)\.(com)/));
//["houdunren.com", "ren", "com", index: 0, input: "houdunren.com", groups: undefined]
下面使用原子组匹配标题元素
let hd = `

houdunren


后盾人

hdcms


`; console.table(hd.match(/<(h[1-6])[\s\S]*<\/\1>/g));
检测 0~100 的数值,使用 parseInt 将数值转为10进制
console.log(/^(\d{1,2}|100)$/.test(parseInt(09, 10))); ### [#](https://doc.houdunren.com/js/14%20%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F.html#%E9%82%AE%E7%AE%B1%E5%8C%B9%E9%85%8D)邮箱匹配 下面使用原子组匹配邮箱
let hd = "2300071698@qq.com";
let reg = /^[\w\-]+@[\w\-]+\.(com|org|cn|cc|net)$/i;
console.dir(hd.match(reg));
如果邮箱是以下格式 houdunren@hd.com.cn 上面规则将无效,需要定义以下方式
let hd = `admin@houdunren.com.cn`;
let reg = /^[\w-]+@([\w-]+\.)+(org|com|cc|cn)$/;
console.log(hd.match(reg)); ### [#](https://doc.houdunren.com/js/14%20%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F.html#%E5%BC%95%E7%94%A8%E5%88%86%E7%BB%84)引用分组 \n 在匹配时引用原子组, $n 指在替换时使用匹配的组数据。下面将标签替换为p标签
let hd = `

houdunren


后盾人

hdcms


`; let reg = /<(h[1-6])>([\s\S]*)<\/\1>/gi;
console.log(hd.replace(reg, `

$2

`));
如果只希望组参与匹配,便不希望返回到结果中使用 (?: 处理。下面是获取所有域名的示例
let hd = `
https://www.houdunren.com
http://houdunwang.com
https://hdcms.com
`; let reg = /https?:\/\/((?:\w+\.)?\w+\.(?:com|org|cn))/gi;
while ((v = reg.exec(hd))) {
console.dir(v);
} ### [#](https://doc.houdunren.com/js/14%20%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F.html#%E5%88%86%E7%BB%84%E5%88%AB%E5%90%8D)分组别名 如果希望返回的组数据更清晰,可以为原子组编号,结果将保存在返回的 groups字段中
let hd = "

houdunren.com

";
console.dir(hd.match(/<(?h[1-6])[\s\S]*<\/\1>/));
组别名使用 ?<> 形式定义,下面将标签替换为p标签
let hd = `

houdunren


后盾人

hdcms


`;
let reg = /<(?h[1-6])>(?[\s\S]*)<\/\1>/gi;
console.log(hd.replace(reg, `

$

`));
获取链接与网站名称组成数组集合

后盾人
hdcms
新浪
## [#](https://doc.houdunren.com/js/14%20%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F.html#%E9%87%8D%E5%A4%8D%E5%8C%B9%E9%85%8D)重复匹配 ### [#](https://doc.houdunren.com/js/14%20%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F.html#%E5%9F%BA%E6%9C%AC%E4%BD%BF%E7%94%A8-2)基本使用 如果要重复匹配一些内容时我们要使用重复匹配修饰符,包括以下几种。 | **符号** | **说明** | | --- | --- | | * | 重复零次或更多次 | | + | 重复一次或更多次 | | ? | 重复零次或一次 | | {n} | 重复n次 | | {n,} | 重复n次或更多次 | | {n,m} | 重复n到m次 | 因为正则最小单位是元字符,而我们很少只匹配一个元字符如a、b所以基本上重复匹配在每条正则语句中都是必用到的内容。
默认情况下重复选项对单个字符进行重复匹配,即不是贪婪匹配
let hd = "hdddd";
console.log(hd.match(/hd+/i)); //hddd
使用原子组后则对整个组重复匹配
let hd = "hdddd";
console.log(hd.match(/(hd)+/i)); //hd
下面是验证坐机号的正则
let hd = "010-12345678";
console.log(/0\d{2,3}-\d{7,8}/.exec(hd));
验证用户名只能为3~8位的字母或数字,并以字母开始




验证密码必须包含大写字母并在5~10位之间



### [#](https://doc.houdunren.com/js/14%20%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F.html#%E7%A6%81%E6%AD%A2%E8%B4%AA%E5%A9%AA)禁止贪婪 正则表达式在进行重复匹配时,默认是贪婪匹配模式,也就是说会尽量匹配更多内容,但是有的时候我们并不希望他匹配更多内容,这时可以通过?进行修饰来禁止重复匹配 | **使用** | **说明** | | --- | --- | | *? | 重复任意次,但尽可能少重复 | | +? | 重复1次或更多次,但尽可能少重复 | | ?? | 重复0次或1次,但尽可能少重复 | | {n,m}? | 重复n到m次,但尽可能少重复 | | {n,}? | 重复n次以上,但尽可能少重复 | 下面是禁止贪婪的语法例子
let str = "aaa";
console.log(str.match(/a+/)); //aaa
console.log(str.match(/a+?/)); //a
console.log(str.match(/a{2,3}?/)); //aa
console.log(str.match(/a{2,}?/)); //aa
将所有span更换为h4 并描红,并在内容前加上 后盾人-


houdunwang
hdcms.com
houdunren.com



下面是使用禁止贪婪查找页面中的标题元素


houdunren.com


hdcms.com




## [#](https://doc.houdunren.com/js/14%20%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F.html#%E5%85%A8%E5%B1%80%E5%8C%B9%E9%85%8D)全局匹配 ### [#](https://doc.houdunren.com/js/14%20%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F.html#%E9%97%AE%E9%A2%98%E5%88%86%E6%9E%90)问题分析 下面是使用match 全局获取页面中标签内容,但并不会返回匹配细节

houdunren.com


hdcms.com


后盾人


### [#](https://doc.houdunren.com/js/14%20%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F.html#matchall)matchAll 在新浏览器中支持使用 matchAll 操作,并返回迭代对象
需要添加 g 修饰符
let str = "houdunren";
let reg = /[a-z]/ig;
for (const iterator of str.matchAll(reg)) {
console.log(iterator);
}
在原型定义 matchAll方法,用于在旧浏览器中工作,不需要添加g 模式运行
String.prototype.matchAll = function(reg) {
let res = this.match(reg);
if (res) {
let str = this.replace(res[0], "^".repeat(res[0].length));
let match = str.matchAll(reg) || [];
return [res, ...match];
}
};
let str = "houdunren";
console.dir(str.matchAll(/(U)/i)); ### [#](https://doc.houdunren.com/js/14%20%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F.html#exec)exec 使用 g 模式修正符并结合 exec 循环操作可以获取结果和匹配细节

houdunren.com


hdcms.com


后盾人




使用上面定义的函数来检索字符串中的网址
let hd = `https://hdcms.com
https://www.sina.com.cn
https://www.houdunren.com`; let res = search(hd, /https?:\/\/(\w+\.)?(\w+\.)+(com|cn)/gi);
console.dir(res); ## [#](https://doc.houdunren.com/js/14%20%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F.html#%E5%AD%97%E7%AC%A6%E6%96%B9%E6%B3%95)字符方法 下面介绍的方法是 String 提供的支持正则表达式的方法 ### [#](https://doc.houdunren.com/js/14%20%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F.html#search)search search() 方法用于检索字符串中指定的子字符串,也可以使用正则表达式搜索,返回值为索引位置
let str = "houdunren.com";
console.log(str.search("com"));
使用正则表达式搜索
console.log(str.search(/\.com/i)); ### [#](https://doc.houdunren.com/js/14%20%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F.html#match)match 直接使用字符串搜索
let str = "houdunren.com";
console.log(str.match("com"));
使用正则获取内容,下面是简单的搜索字符串
let hd = "houdunren";
let res = hd.match(/u/);
console.log(res);
console.log(res[0]); //匹配的结果
console.log(res[index]); //出现的位置
如果使用 g 修饰符时,就不会有结果的详细信息了(可以使用exec),下面是获取所有h1~6的标题元素
let body = document.body.innerHTML;
let result = body.match(/<(h[1-6])>[\s\S]+?<\/\1>/g);
console.table(result); ### [#](https://doc.houdunren.com/js/14%20%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F.html#matchall-2)matchAll 在新浏览器中支持使用 matchAll 操作,并返回迭代对象
let str = "houdunren";
let reg = /[a-z]/ig;
for (const iterator of str.matchAll(reg)) {
console.log(iterator);
} ### [#](https://doc.houdunren.com/js/14%20%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F.html#split)split 用于使用字符串或正则表达式分隔字符串,下面是使用字符串分隔日期
let str = "2023-02-12";
console.log(str.split("-")); //["2023", "02", "12"]
如果日期的连接符不确定,那就要使用正则操作了
let str = "2023/02-12";
console.log(str.split(/-|\//)); ### [#](https://doc.houdunren.com/js/14%20%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F.html#replace)replace replace 方法不仅可以执行基本字符替换,也可以进行正则替换,下面替换日期连接符
let str = "2023/02/12";
console.log(str.replace(/\//g, "-")); //2023-02-12
替换字符串可以插入下面的特殊变量名: | **变量** | **说明** | | --- | --- | | $$ | 插入一个 "$"。 | | $& | 插入匹配的子串。 | | $` | 插入当前匹配的子串左边的内容。 | | $' | 插入当前匹配的子串右边的内容。 | | $n | 假如第一个参数是 RegExp 对象,并且 n 是个小于100的非负整数,那么插入第 n 个括号匹配的字符串。提示:索引是从1开始 | 在后盾人前后添加三个=
let hd = "=后盾人=";
console.log(hd.replace(/后盾人/g, "$`$`$&$'$'"));
把电话号用 - 连接
let hd = "(010)99999999 (020)8888888";
console.log(hd.replace(/\((\d{3,4})\)(\d{7,8})/g, "$1-$2"));
把所有教育汉字加上链接 https://www.houdunren.com

在线教育是一种高效的学习方式,教育是一生的事业


为链接添加上https ,并补全 www.



开源系统

后盾人
雅虎

http://www.hdcms.com





将标题标签全部替换为 p 标签

houdunren.com


hdcms.com


后盾人



删除页面中的 h1~h6 标签

houdunren.com


hdcms.com


后盾人




**回调函数**
replace 支持回调函数操作,用于处理复杂的替换逻辑 | **变量名** | **代表的值** | | --- | --- | | match | 匹配的子串。(对应于上述的$&。) | | p1,p2, ... | 假如replace()方法的第一个参数是一个 RegExp 对象,则代表第n个括号匹配的字符串。(对应于上述的$1,$2等。)例如,如果是用 /(\\a+)(\\b+)/ 这个来匹配,p1 就是匹配的 \\a+,p2 就是匹配的 \\b+。 | | offset | 匹配到的子字符串在原字符串中的偏移量。(比如,如果原字符串是 'abcd',匹配到的子字符串是 'bc',那么这个参数将会是 1) | | string | 被匹配的原字符串。 | | NamedCaptureGroup | 命名捕获组匹配的对象 | 使用回调函数将 后盾人 添加上链接


后盾人不断更新优质视频教程


为所有标题添加上 hot 类


后盾人


houdunren.com


后盾人




## [#](https://doc.houdunren.com/js/14%20%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F.html#%E6%AD%A3%E5%88%99%E6%96%B9%E6%B3%95)正则方法 下面是 RegExp 正则对象提供的操作方法 ### [#](https://doc.houdunren.com/js/14%20%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F.html#test)test 检测输入的邮箱是否合法


### [#](https://doc.houdunren.com/js/14%20%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F.html#exec-2)exec 不使用 g 修饰符时与 match 方法使用相似,使用 g 修饰符后可以循环调用直到全部匹配完。 - 使用 g 修饰符多次操作时使用同一个正则,即把正则定义为变量使用 - 使用 g 修饰符最后匹配不到时返回 null 计算内容中后盾人出现的次数


后盾人不断分享视频教程,后盾人网址是 houdunren.com

## [#](https://doc.houdunren.com/js/14%20%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F.html#%E6%96%AD%E8%A8%80%E5%8C%B9%E9%85%8D)断言匹配 断言虽然写在扩号中但它不是组,所以不会在匹配结果中保存,可以将断言理解为正则中的条件。 ### [#](https://doc.houdunren.com/js/14%20%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F.html#exp)(?=exp) **零宽先行断言**?=exp 匹配后面为 exp 的内容
把后面是教程 的后盾人汉字加上链接


后盾人不断分享视频教程,学习后盾人教程提升编程能力。


下面是将价格后面 添加上 .00

使用断言验证用户名必须为五位,下面正则体现断言是不是组,并且不在匹配结果中记录


### [#](https://doc.houdunren.com/js/14%20%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F.html#exp-2)(?<=exp) **零宽后行断言**?<=exp 匹配前面为 exp 的内容
匹配前面是houdunren 的数字
let hd = "houdunren789hdcms666";
let reg = /(?<=houdunren)\d+/i;
console.log(hd.match(reg)); //789
匹配前后都是数字的内容
let hd = "houdunren789hdcms666";
let reg = /(?<=\d)[a-z]+(?=\d{3})/i;
console.log(hd.match(reg));
所有超链接替换为houdunren.com

百度
雅虎


下例中将 后盾人 后面的视频添加上链接

后盾人视频不断录制案例丰富的视频教程



将电话的后四位模糊处理
let users = `
向军电话: 12345678901
后盾人电话: 98745675603
`; let reg = /(?<=\d{7})\d+\s*/g;
users = users.replace(reg, str => {
return "*".repeat(4);
});
console.log(users); //向军电话: 1234567****后盾人电话: 9874567****
获取标题中的内容
let hd = `

后盾人视频不断录制案例丰富的视频教程

`;
let reg = /(?<=

).*(?=<\/h1>)/g;
console.log(hd.match(reg)); ### [#](https://doc.houdunren.com/js/14%20%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F.html#exp-3)(?!exp) **零宽负向先行断言** 后面不能出现 exp 指定的内容
使用 (?!exp)字母后面不能为两位数字
let hd = "houdunren12";
let reg = /[a-z]+(?!\d{2})$/i;
console.table(reg.exec(hd));
下例为用户名中不能出现向军





### [#](https://doc.houdunren.com/js/14%20%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F.html#exp-4)(?获取前面不是数字的字符
let hd = "hdcms99houdunren";
let reg = /(?console.log(reg.exec(hd)); //hdcms
把所有不是以 https://oss.houdunren.com 开始的静态资源替换为新网址


1.jpg
2.jpg
3.jpg
3.jpg