一、✨语法
/正则表达式主体/修饰符(可选)
其中修饰符是可选的。
var patt = /runoob/i
二、✨关于正则表达式的方法
1. 🎉test()
用来查看正则表达式与指定的字符串是否匹配。返回true或false。
let str = 'hello world';
let result = /^hello/.test(str);
console.log(result);
// true
2. 🎉match()
执行后返回的数据类型:
-
如果有匹配返回数组类型,否则返回null
-
在全局模式匹配:匹配到的每一项,依次显示在数组中。(无数组属性)
-
在非全局模式匹配:数组的第 0 个元素存放的是匹配文本,而其余的元素存放的是与正则表达式的子表达式匹配的文本。并且会返回数组属性,其index是匹配到的字符位置,input是字符串的引用。
'abc'.match(/e/); //null
'abc'.match(/b/); //['b', index: 1, input: 'abc', groups: undefined]
'a1b2'.match(/\d/g); //['1', '2']
3. 🎉exec()
主要应用场景:
- 用于文本检索
- 匹配多表达式时,以数据形式一次性返回
- 返回更多更全面的匹配相关的信息
匹配模式、结果:
-
如果未找到匹配,则返回值为null。
-
在非全局匹配模式下,此函数的作用和match函数是一样的。
-
在全局模式会相对比较复杂。
//全局匹配示例 var str = 'ab1ab2'; var reg = /b\d/g; console.log(reg.exec(str)); //输出:['b1', index: 1, input: 'ab1ab2ab3ab4', groups: undefined] console.log(reg.lastIndex); //输出:3
console.log(reg.exec(str)) // 输出:['b2', index: 4, input: 'ab1ab2ab3', groups: undefined] console.log(reg.lastIndex) // 输出:6
console.log(reg.exec(str)) // 输出:null console.log(reg.lastIndex) // 输出:0
注:在全局模式下,每次匹配后返回当前匹配文本的第一个字符的位置,通过reg.lastIndex会匹配文本的最后一个字符的下一个位置。因此开始和结束的索引值并不在一个对象上。
在继续匹配时会使用lastIndex作为新的起点
可以手动设置lastIndex的值设置全局匹配的起点,默认为0
匹配结束后会返回null,再次匹配时会从第一个开始,一直循环匹配(一般通过null来判断是否终止匹配)
-
在匹配子表单式时(可以参考前面提到的匹配URL字符串)
// 简单示例
var str='abc123' var reg=/c(\d{3})/ console.log(reg.exec(str)) // 输出:['c123', '123', index: 2, input: 'abc123', groups: undefined] // 其中 'c123' 为完整匹配,'123'为括号内的字表达式
如果有匹配,则数组的第一项为完整的匹配结果,后面依次为每个子表达式的匹配结果。
如果没匹配则返回null
如果有全局匹配,同上面的全局匹配示例,会已数组形式返回每一次匹配到的结果
4. 🎉search():用户检索字符串的位置
🎊可传入需要检索的字符串
var str = 'abcdefg'
var result = str.search('cd')
console.log(result) // 输出:2
🎊可传入正则表达式检索
var str = 'abcdefg'
var result = str.search(/cd/)
console.log(result) // 输出:2
5. 🎉replace/replaceAll
表单式为:str.replaceAll(regexp/substr,replacement)
-
**replaceAll如果用正则检索,必须使用g(全局修饰符),**否则会提示错误(replaceAll called with a non-global RegExp argument)。
-
replaceAll如果用字符串检索,则会替换所有匹配到的字符串。
-
如果其replacement 为回调函数时,同样也会执行每一次的匹配。但回调中的参数需要注意
-
无子表单式 var str = 'abcb' // 使用正则必须加全局修饰符 var result = str.replaceAll(/b/g, function(...args){ console.log(args) return args[0] }) // args的值会依次输出 // ['b', 1, 'abcb'] // ['b', 3, 'abcb']
-
有子表达式 var str = 'ab1cb2' // 使用正则必须加全局修饰符 var result = str.replaceAll(/b(\d)/g, function(...args){ console.log(args) return args[0] }) // args的值会依次输出 // ['b1', '1', 1, 'ab1cb2'] // ['b2', '2', 4, 'ab1cb2']
-
- replacement为回调函数时,其参数会根据有无子表达式而不一样
- 无子表达式时,参数依次为(当前匹配结果、当前匹配文本的第一个字符的位置、完整字符)
- 无子表达式时,参数依次为(当前匹配结果、若干匹配的子项结果、当前匹配文本的第一个字符的位置、完整字符)
6. 🎉split()
(用于把一个字符串分割成字符串数组。) 表单式为:stringObject.split(separator,howmany)
separator可为字符串或正则
howmany为数字,指定返回的数组的最大长度。
"hello".split("") //可返回 ["h", "e", "l", "l", "o"]
"hello".split("", 3) //可返回 ["h", "e", "l"]
三、✨正则表达式修饰符
修饰符可以在全局搜索中不区分大小写:
修饰符
描述
i
执行对大小写不敏感的匹配
g
执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)
m
执行多行匹配
四、✨正则表达式模式
🎊方括号用于查找某个范围内的字符:
表达式
描述
[abc]
查找方括号之间的任何字符。
[0-9]
查找任何从 0 至 9 的数字。
(x|y)
查找任何以 | 分隔的选项。
🎊元字符是拥有特殊含义的字符:
元字符
描述
.
查找单个字符(除了换行和行结束符)
\w
匹配字母、数字、下划线。等价于 [A-Za-z0-9_]
\W
匹配一个非单字字符(和\w相反)
\d
查找数字。
\D
匹配非数字字符
\s
查找空白字符。
\S
匹配非空白字符
\b
匹配单词边界。
\B
匹配非单词边界
\0
查找 NUL字符[\x00-\x7F],如/\0/.test('\x00') // true
\n
查找换行符
\f
查找换页符
\r
查找回车符
\t
查找制表符
\v
查找垂直制表符
\xxx
查找以八进制数 xxxx 规定的字符
\xdd
查找以十六进制数 dd 规定的字符
\uxxxx
查找以十六进制 xxxx规定的 Unicode 字符
匹配一个四位十六进制数表示的 UTF-16 代码单元。
🎊量词:
量词
描述
^
匹配开头,在多行检测中,会匹配一行的开头
$
匹配结尾,在多行检测中,会匹配一行的结尾
*
匹配前面的子表达式零次或多次。
匹配前面的子表达式一次或多次。
?
匹配前面的子表达式零次或一次。
{n}
n 是一个非负整数。匹配确定的 n 次。
{n,}
n 是一个非负整数。至少匹配n 次。
{n,m}
m 和 n 均为非负整数,最少匹配 n 次且最多匹配 m 次