Javascript正则表达式总结
will.wei 8/4/2021 正则表达式
# Javascript正则表达式总结
在Javascript中,正则表达式也是对象。
# 正则表达式概念
- 正则表达式是由一个字符序列形成的搜索模式。
- 当你在文本中搜索数据时,你可以用搜索模式来描述你要查询的内容。
- 正则表达式可以是一个简单的字符,或一个更复杂的模式。
- 正则表达式可用于所有文本搜索和文本替换的操作。
在Javascript中,正则表达式也是对象。可以使用两种方法来构建正则表达式;
- 使用一个正则表达式字面量,其由包含在斜杠之间的模式组成;
- 调用RegExp对象的构造函数;
let re1 = /ab+c/;
let re2 = new RegExp("ab+c");
re1 instanceof RegExp; // true
re2 instanceof RegExp; // true
1
2
3
4
2
3
4
涉及方法:
RegExp包含exec
,test
方法,String
包含match
、matchAll
、replace
、search
和split
方法;
# 贪婪非贪婪
默认情况下,正则表达式量词如*、+、都是贪婪匹配,所谓贪婪匹配,就是尽可能匹配多的字符。
当在量词后面加一个?就可以实现非贪婪匹配,即尽可能匹配少的字符。
let str = "Hello, My name is will wei.";
/M.+/.exec(str)[0]; // "My name is will wei." 贪婪匹配,M后面尽可能多的字符
/M.+?/.exec(str)[0]; // "My" 非贪婪匹配,M后面尽可能少的字符
1
2
3
2
3
# 分组和捕获
分组是用圆括号“()”括起来的正则表达式,匹配出的内容就表示一个分组。
- (exp): 分组,并捕获该分组匹配到的文本;
- (?:exp): 分组,但不捕获该分组匹配到的文本
当一个正则表达式被分组后。每个分组被自动赋予一个组号,从左到右分别是12...分组,又称为子表达式。
let reg1 = /^(\d{4})[/-](\d{1,2})[/-](\d{1,2})$/;
console.log('2020/8/1'.replace(reg1,'$1年$2月$3日')) // 2020年8月1日
console.log('2020-8-1'.replace(reg1,'$1年$2月$3日')) // 2020年8月1日
// 不捕获天
let reg2 = /^(\d{4})[/-](\d{1,2})[/-](?:\d{1,2})$/;
console.log('2020/8/1'.replace(reg1,'$1年$2月$3日')) // 2020年8月$3日
console.log('2020-8-1'.replace(reg1,'$1年$2月$3日')) // 2020年8月$3日
1
2
3
4
5
6
7
2
3
4
5
6
7
# 断言
用于查找在某些内容(但并不包括这些内容)之前或之后的东西,也就是说它们像b,^,$那样用于指定一个位置,这个位置应该满足一定的条件(即断言),因此它们也被称为零宽断言。
前瞻断言
- (?=exp)顺序肯定环境,表示所在位置右侧能够匹配exp
- (?!exp)顺序否定环境,表示所在位置右侧不能匹配exp
后瞻断言 - (?<=exp)逆序肯定环境,表示所在位置左侧能够匹配exp
- (?<!exp>)逆序否定环境,表示所在位置左侧不能匹配exp
let str = "Hello, My name is will wei.";
/w(?=ei)/.exec(str).index; // 21,匹配到的是wei中的w
/w(?!ei)/.exec(str).index; // 18,匹配到的是will中的w
/(?<=H)e/.exec(str).index; // 1,匹配到的是Hello中的w
/(?<!H)e/.exec(str).index; // 13,匹配到的是name中的e
1
2
3
4
5
2
3
4
5