正则表达式
在 JavaScript
中,正则表达式通过内建的 RegExp
类的对象来实现,并与字符串集成
正则表达式是用于匹配字符串中字符组合的模式,在 JavaScript
中,正则表达式也是对象
这些模式被用于 RegExp
的 exec
和 test
方法, 以及 String
的 match
、matchAll
、replace
、search
和 split
方法
1. 正则创建与属性
创建一个正则表达式对象有两种语法
- 字面量创建
- 对象创建
1-1 字面量创建
使用一个正则表达式字面量,其由包含在斜杠之间 /.../
的模式组成
使用 /.../
包裹的字面量创建方式是推荐的作法,但它不能在其中使用变量
let regexp = /pattern/; // 没有修饰符
let regexp = /pattern/flags; // 伴随修饰符 g、m 和 i
1-2 对象创建
简短语法 /.../
,它不接受任何变量插入
new RegExp
允许从字符串中动态地构造模式
我们可以找出需要搜索的字段,然后根据搜索字段创建 new RegExp
let regexp = new RegExp("pattern", "flags");
let str = 'I will keep working hard'
let regexp1 = new RegExp("will", 'i')
let regexp1 = new RegExp(/will/, 'i')
console.log(str.search(regexp1)); // 2
1-3 lastIndex 属性
lastIndex
是正则表达式的一个可读可写的整型属性,用来指定下一次匹配的起始索引
只有正则表达式使用了表示全局模式检索的 g
标志时,该属性才会起作用
- 如果
lastIndex
大于字符串的长度,则regexp.test
和regexp.exec
将会匹配失败,然后lastIndex
被设置为 0 - 如果
lastIndex
等于字符串的长度,且该正则表达式匹配空字符串,则该正则表达式匹配从lastIndex
开始的字符串 - 如果
lastIndex
等于字符串的长度,且该正则表达式不匹配空字符串 ,则该正则表达式不匹配字符串,lastIndex
被设置为 0 - 否则
lastIndex
被设置为紧随最近一次成功匹配的下一个位置
lastIndex = regExpObj.lastIndex;
// lastIndex属性 当全局模式g下才能起作用
// 下一次匹配的起始索引
let next = 'hello world';
let regexp1 = /l/g;
console.log(regexp1.test(next)); // true
console.log(regexp1.lastIndex); // 3
// lastIndex > 字符串长度 匹配失败 lastIndex重置为0
regexp1.lastIndex = 20;
console.log(regexp1.test(next)); // false
console.log(regexp1.lastIndex); // 0
// lastIndex = 字符串长度 匹配空字符串 从lastIdnex开始
let reg = /\s/g;
reg.lastIndex = 1;
console.log(reg.test(next)); // true
console.log(reg.lastIndex); // 6
// lastIndex = 字符串长度 不匹配空字符串 重置为0
let reg1 = /\S/g;
reg1.lastIndex = next.length;
console.log(reg1.test(next)); // false
console.log(reg1.lastIndex); // 0
1-4 转义字符
/.../
转义
把特殊字符作为常规字符来使用,只需要在它前面加个反斜杠 \
这里是包含所有特殊字符的列表:[ \ ^ $ . | ? * + ( )
-
在
/.../
中把特殊字符作为常规字符来使用[ \ ^ $ . | ? * + ( )
时需要转义 -
斜杠符号
'/'
并不是一个特殊符号,但是它被用于在Javascript
中开启和关闭正则匹配,所有需要转义
// regexp转义 通过反斜线即可将特殊字符转义
let str = "jsx.ljj";
// 通过\. 将.特殊字符转义
console.log(str.match(/\w\.\w/g)); // ['x.l']
console.log('function go(){}'.match(/go\(\)/g)); // ['go()']
// 当需要一个反斜杠时,可使用两个反斜杠转义
console.log('as\\d'.match(/\\/g)); // ['\\']
new RegExp()
转义
- 使用
new RegExp()
创建正则时,传入字符串匹配以字符串转义规则,在字符串中的反斜杠表示转义,所以调用new RegExp
会获得一个没有反斜杠的字符串
// 斜杠/ 用来关闭开启正则,如果需要匹配斜杠需要转义
console.log('/'.match(/\//g)); // ['/']
// 在new RegExp中/ 不需要转义
console.log('/'.match(new RegExp('/', 'g'))) // ['/']
// new RegExp 传入的是字符串匹配,按照字符串转义
let str1 = '\\d\.\\d';
console.log('asd5.0'.match(new RegExp(str1, 'g'))); // ['5.0']
2. 模式修饰符
正则表达式有六个可选参数 (flags
) 允许全局和不分大小写搜索等
这些参数既可以单独使用也能以任意顺序一起使用, 并且被包含在正则表达式实例中
i
:搜索时不区分大小写:A
和a
没有区别g
:全局搜索模式,搜索时会查找所有的匹配项,而不只是第一个m
:多行模式s
:启用dotall
模式,允许点.
匹配换行符\n
u
:开启完整的unicode
支持y
:粘性模式
2-1 i
大小写模式
搜索时不区分大小写: A
和 a
没有区别
let str = 'I will keep working hard';
console.log(str.search(/KEEP/g)); // -1
console.log(str.search(/KEEP/ig)); // 7
- 第一个搜索返回的是
-1
(也就是没找到),因为搜索默认是区分大小写的 - 使用修饰符
/KEEP/i
,在字符串的第 7 个位置上搜索到了keep
2-2 g
全局模式
全局搜索模式,搜索时会查找所有的匹配项,而不只是第一个
let str1= 'I will keep working hard KEEP';
console.log(str1.match(/KEEP/ig)); // ['keep', 'KEEP']
-
match
方法,如果regexp
带有g
修饰符,则它将所有匹配项的数组作为字符串返回 -
使用
/KEEP/ig
匹配全局无论大小写的keep
2-3 m
多行模式
通过 /.../m
开启多行模式,在多行模式下 ^
和 $
会匹配每一行的开始与结束
let str3 = `1st name: JSX
2st name: LJJ
3st nameL DDC`
console.log(str3.match(/\w+$/gim)); // ['JSX', 'LJJ', 'DDC']
// 在多行模式下 ^ 和 $ 会匹配每一行的开始与结束
console.log(str3.match(/^\d+/gm)); // ['1', '2', '3']
也可以通过换行符 \n
,但是换行符 \n
不会匹配字符串结尾,会匹配 \n
字符类返回
let str3 = `1st name: JSX
2st name: LJJ
3st nameL DDC`
console.log(str3.match(/\w+\n/gim)); // ['JSX\n', 'LJJ\n']
2-4 s
dotall
模式
s
修饰符开启 dotAll
模式,使得.
点字符可以匹配任意单个字符
正则表达式还引入了一个dotAll
属性,返回一个布尔值,表示该正则表达式是否处在dotAll
模式
let str4 = '12436>:{">{~!@(\n';
console.log(str4.match(/./sg));
// ['1', '2', '4', '3', '6', '>', ':', '{', '"', '>', '{', '~', '!', '@', '(', '\n']
// dotAll属性 检测是否处于dotAll模式
console.log(/./sg.dotAll); // true
2-5 u
Unicode 模式
修饰符 u
在正则表达式中提供对 Unicode
的支持
在 unicode
中 \p{Ll}
转义字符加标点符号 p
相等于匹配所有字母
- 4 个字节长的字符被以正确的方式处理:被看成单个的字符,而不是 2 个 2 字节长的字符
Unicode
属性可以被用于查找中
\p{
Unicode属性值}
let str3