10-正则表达式(Regular Expression)

1. 正则创建

1-1. 方式一:字面量创建

  • \正则表达式\
let str = "andhhasdjh125563jkhh";
let reg = /\d+/;
let result = str.match(reg);
console.log(result);

>["125563", index: 10, input: "andhhasdjh125563jkhh", groups: undefined]

1-2. 方式二:构造函数创建

  • 加引号 —— " "
  • 若正则表达式中存在"",需要加转义字符""
let str = "andhhasdjh125563jkhh";
let reg = new RegExp("\\d+");
let result = str.match(reg);
console.log(result);

>["125563", index: 10, input: "andhhasdjh125563jkhh", groups: undefined]

1-3. 全局匹配 — g

  • 方式一的全局匹配格式
let str = "hhasdjh125563jkhh888llg";
let reg = /\d+/g;
let result = str.match(reg);
console.log(result);

>(2) ["125563", "888"]
  • 方式二的全局匹配格式
let str = "hhasdjh125563jkhh888llg";
let reg = new RegExp("\\d+","g");
let result = str.match(reg);
console.log(result);

>(2) ["125563", "888"]

1-4. 创建方式的选取

  • 一般情况下由于第一种方式的简单快捷,直接选取第一种方式
  • 表达式是一个变量时,只能采用第二种方式
let str = "andhhasdjh125563jkhh";
let exp = "hasd";
let reg = new RegExp(exp);
let result = str.match(reg);
console.log(result);

>["hasd", index: 4, input: "andhhasdjh125563jkhh", groups: undefined]

2. 正则方法 — Reg.function()

2-1. test()

  • 测试是否有值满足正则表达式
  • 返回值为true、false
let str="sjh5932jiui8943";
let reg = /\d+/;
let res = reg.test(str);
console.log(res);

>true

2-2. exec()

  • 用于检索字符串中的正则表达式的匹配
  • 返回一个数组,其中存放匹配的结果。如果未找到匹配,则返回值为 null
let str="sjh5932jiui8943";
let reg = /\d+/;
let res = reg.exec(str);
console.log(res);

>["5932", index: 3, input: "sjh5932jiui8943", groups: undefined]
  • 若为全局匹配,则可以反复调用 exec() 方法来遍历字符串中的所有匹配文本
let str = "sjh5932jiui8943";
let reg = /\d+/g;
let res = reg.exec(str);
console.log(res);
let res1 = reg.exec(str);
console.log(res1);
let res2 = reg.exec(str);
console.log(res2);

>["5932", index: 3, input: "sjh5932jiui8943", groups: undefined]
>["8943", index: 11, input: "sjh5932jiui8943", groups: undefined]
>null

3. 字符串方法 — String.function()

3-1. split()

  • 根据正则表达式分割字符串
// 根据数字分割字符串
let str = "sjh5932jiui8943iishj";
let reg = /\d+/;
let res = str.split(reg);
console.log(res);
>(3) ["sjh", "jiui", "iishj"]

3-2. replace()

  • 根据正则表达式替换字符串
// 敏感词过滤
let str = "据中国教育部数据显示,2007年至2018年,中国出国留学人数由14万增至66.2万,年均增长约14%;而同期的留学归国人数由4万增至51.9万,年均增长近24%。归国热潮下,海归就业的供需市场如何,成为留学人员与国内用人单位的共同关注。";
let reg = /教育部|人员/g;
let res = str.replace(reg,function(arg){
	// arg:匹配到的字符串
    console.log(arg);
    return "*".repeat(arg.length)
})
console.log(res)

>据中国***数据显示,2007年至2018年,中国出国留学人数由14万增至66.2万,年均增长约14%;而同期的留学归国人数由4万增至51.9万,年均增长近24%。归国热潮下,海归就业的供需市场如何,成为留学**与国内用人单位的共同关注。

3-3. search()

  • 根据正则表达式匹配第一个符合结果的索引值位置; 如果找不到,则返回 -1
  • 会忽略全局匹配
let str = "jui785pok863usn";
let reg = /\d+/;
let res = str.search(reg);
console.log(res)

>3

3-4. match()

  • 根据正则表达式返回符合要求的字符串
  • 非全局匹配,则只返回第一个符合要求的结果且描述详细
let str = "jui785pok863usn";
let reg = /\d+/;
let res = str.match(reg);
console.log(res)
>["785", index: 3, input: "jui785pok863usn", groups: undefined]
  • 若是全局匹配,则返回所有符合要求但描述不详细
let str = "jui785pok863usn";
let reg = /\d+/g;
let res = str.match(reg);
console.log(res)
>(2) ["785", "863"]

4. 元字符

  • 正则中有特殊含义的非字母字符
  • . * + ? $ ^ | \ () [] {}

4-1. \

  • 转义字符,将特殊含义转换成字面量含义

4-2. *

  • 匹配前面的子表达式0次或多次

4-3. +

  • 匹配前面的子表达式1次或多次

4-4. .

  • 匹配除了 \n \r \u2028 或 \u2029 以外的所有字符
let str = `<div>some value..</div>`;
let reg = /<div>.*<\/div>/g;
let res = reg.test(str);
console.log(res);

>true

4-5. \w

  • \w 元字符用于查找单词字符
  • 单词字符包括:a-z、A-Z、0-9,以及下划线, 包含 _ (下划线) 字符

4-6. ^表达式$

  • ^:匹配输入字行首
  • $:匹配输入行尾
let str = "cde__111fg";
let reg = /^c\w+g$/g;
let res = reg.test(str);
console.log(res);

>true

4-7. []

  • 表示字符集合
  • [ab]:表示匹配a或者b
let str = "dffdabfds123fdabfdb435afdsa";
let reg = /[ab]/g;
let res = str.replace(reg, "*");
console.log(res);

dffd**fds123fd**fd*435*fds*
  • [^ab]:表示匹配非a或者非b
let str = "dffdabfds123fdabfdb435afdsa";
let reg = /[^ab]/g;
let res = str.replace(reg, "*");
console.log(res);

>****ab********ab**b***a***a
  • [0-9]+:等同于\d+
let str = "dffdabfds123fdabfdb435afdsa";
let reg = /[0-9]/g;
let res = str.replace(reg, "*")
console.log(res);

>dffdabfds***fdabfdb***afdsa

4-8. \b

  • 边界符,匹配一个零宽单词边界
  • \w都被称为边界
let str = "is this a book?";
let reg = /\bis\b/g;
// let reg = new RegExp("\\bis\\b","g");
let arr =  str.match(reg);
console.log(arr);

>["is"]

4-9. {n}

  • 匹配确定的n次
  • ?相当于{0,1}
  • +相当于{1,}
  • *相当于{0,}
let str = "is this a book?";
let reg = /o{2}/g;
let arr = str.replace(reg, "*");
console.log(arr);

>is this a b*k?

4-10. ()

  • 分组

  • 替换abab

let str = "abab";
let reg = /ab{2}/g;
let arr = reg.test(str);
console.log(arr);

>false
  • 未成功替换,因为/ab{2}/匹配的是abb
  • 修改成/(ab){2}/g,替换成功
let str = "abab";
let reg = /(ab){2}/g;
let arr = reg.test(str);
console.log(arr);

>true

4-11. 反向引用—建立在分组的基础上

  • $n代表第n个分组
let time = "2020-09-30";
let reg = /(\d{4})-\d{2}-\d{2}/g;
let res = reg.exec(time)
console.log(RegExp.$1)

>2020
  • 转换时间格式:2019-10-19 — 19/10/2019
let time = "2020-09-30";
let reg = /(\d{4})-(\d{2})-(\d{2})/g;
let res = time.replace(reg, "$3/$2/$1")
console.log(res);

>30/09/2020

4-12. 命名分组:?<分组名>

  • ES2018新增特性
let str = "$name=zhangsan&age=20";
let reg = /\$(?<str>\w+)/;
let res = str.match(reg);
console.log(res);

>(2) ["$name", "name", index: 0, input: "$name=zhangsan&age=20", groups: {}]
 0: "$name"
 1: "name"
 >groups: {str: "name"}
  index: 0
  input: "$name=zhangsan&age=20"
  length: 2
 >__proto__: Array(0)
console.log(res.groups.str)
>name

4-13. 零宽断言

  • ES2018新增
  • 断言后边-正向肯定断言: /(?=表达式)/
// iphone换成苹果
let str = "iphone3iphone4iphone11iphoneNumber";
let reg = /iphone(?=\d{1,2})/g;
let res = str.replace(reg, "苹果");
console.log(res);

>苹果3苹果4苹果11iphoneNumber
  • 断言后边-正向否定断言 : /(?!表达式)/
// iphone换成苹果
let str = "iphone_iphone3iphone4iphone11iphoneNumber";
// 即匹配后边表达式不是\d{1,2}的iphone
let reg = /iphone(?!\d{1,2})/g;
let res = str.replace(reg, "苹果");
console.log(res);

>苹果_iphone3iphone4iphone11苹果Number
  • 断言前边-负向肯定断言:/(?<=表达式)/
let str = "10px20px30pxipx";
let reg = /(?<=\d{2})px/g;
let res = str.replace(reg, "像素");
console.log(res);

>10像素20像素30像素ipx
  • 断言前边-负向否定断言
let str = "10px20px30pxipx";
let reg = /(?<!\d{2})px/g;
let res = str.replace(reg, "像素");
console.log(res);

>10px20px30pxi像素

5. 匹配模式

5-1. g

  • global,全局模式:找到所有匹配,而不是在第一个匹配后停止

5-2. i

  • ignore,忽略大小写模式:匹配不区分大小写
  • 未加i
let str = "aAAaaaAAA";
let reg = /a/g;
let res = str.replace(reg, "*");
console.log(res);

>*AA***AAA
  • i
let str = "aAAaaaAAA";
let reg = /a/gi;
let res = str.replace(reg, "*");
console.log(res);

>*********

5-3. m

  • multiple,多行模式:将开始和结束字符(^和$)视为在多行上工作,而不只是匹配整个输入字符串的最开始和最末尾处
  • 未加m
let str = `sjkjf
lajsd`;
let reg = /^\w/g;
let res = str.replace(reg, "*");
console.log(res);
>*jkjf
 lajsd
  • m
let str = `sjkjf
lajsd`;
let reg = /^\w/gm;
let res = str.replace(reg, "*");
console.log(res);
>*jkjf
 *ajsd

5-4. s

  • dotAll / singleline模式:. 可以匹配换行符
  • 未加s
let str = `<div>some
value..</div>`;
let reg = /<div>.*<\/div>/g;
let res = reg.test(str);
console.log(res);
>false
  • s
let str = `<div>some
value..</div>`;
let reg = /<div>.*<\/div>/gs;
let res = reg.test(str);
console.log(res);
>true

5-5. y

  • sticky,粘性模式:匹配正则中lastIndex属性指定位置的字符,并且如果没有匹配也不尝试从任何后续的索引中进行匹配
let str = "53789dhjsh789jisjk";
let reg = /\d+/gy;
console.log(reg.exec(str));
console.log(reg.exec(str));

>["53789", index: 0, input: "53789dhjsh789jisjk", groups: undefined]
>null
let str = "53789dhjsh789jisjk";
let reg = /\d+/g;
console.log(reg.exec(str));
console.log(reg.exec(str));

>["53789", index: 0, input: "53789dhjsh789jisjk", groups: undefined]
>["789", index: 10, input: "53789dhjsh789jisjk", groups: undefined]
let str = "p53789dhjsh789jisjk";
let reg = /\d+/gy;
console.log(reg.exec(str));
console.log(reg.exec(str));

>null
>null

6. 正则工具

  • http://regexper.com
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值