正则表达式

97 阅读5分钟

一、✨语法

/正则表达式主体/修饰符(可选)

其中修饰符是可选的。

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()

主要应用场景:

  1. 用于文本检索
  2. 匹配多表达式时,以数据形式一次性返回
  3. 返回更多更全面的匹配相关的信息

匹配模式、结果:

  • 如果未找到匹配,则返回值为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)

  1. **replaceAll如果用正则检索,必须使用g(全局修饰符),**否则会提示错误(replaceAll called with a non-global RegExp argument)。

  2. replaceAll如果用字符串检索,则会替换所有匹配到的字符串。

  3. 如果其replacement 为回调函数时,同样也会执行每一次的匹配。但回调中的参数需要注意

    1. 无子表单式 var str = 'abcb' // 使用正则必须加全局修饰符 var result = str.replaceAll(/b/g, function(...args){ console.log(args) return args[0] }) // args的值会依次输出 // ['b', 1, 'abcb'] // ['b', 3, 'abcb']

    2. 有子表达式 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 字符

\uhhhh

匹配一个四位十六进制数表示的 UTF-16 代码单元。

🎊量词:

量词

描述

^

匹配开头,在多行检测中,会匹配一行的开头

$

匹配结尾,在多行检测中,会匹配一行的结尾

*

匹配前面的子表达式零次或多次。

匹配前面的子表达式一次或多次。

匹配前面的子表达式零次或一次。

{n}

n 是一个非负整数。匹配确定的 n 次。

{n,}

n 是一个非负整数。至少匹配n 次。

{n,m}

m 和 n 均为非负整数,最少匹配 n 次且最多匹配 m 次