1. 前言
大部分语言都支持正则表达式,它在处理字符串上大有用处,但由于平时使用次数少,容易忘记,特此梳理和总结如下。
1. 正则表达式初始化方式(2种)
/**
* @param { string } pattern 正则表达式的模式
* @param { 'i'|'g'|'m' } modifiers 修饰符 i-忽略大小写 g-执行全局匹配 g-多行匹配
*/
let reg_1 = new RegExp(pattern, modifiers)
let reg_2 = /pattern/modifiers
// 示例:匹配由1个至多个数字、字母及下划线组成的字符串
reg_1 = new RegExp('\\w+');
reg_2 = new /\w+/
2. 修饰符
修饰符 | 说明 | 示例 |
i | 对大小写不敏感的匹配 | /AbC/i.test('abc') |
g | 全局匹配,即查找出所有匹配 | |
m | 多行匹配 /pattern/m |
3. 方括号表达式
字符组和反字符组。
方括号表达式 | 说明 | 示例 |
[abc] [adgk] | 查找方括号中的任何字符 注:方括号中的字符算是一个集合,在字符串中找到集合中一个就算匹配 | /abc/.test('aaa') 得到true |
[^abc] [^adgk] [^A-Z] | 查找任何不在方括号中的字符 注:和[abc]相反,在字符串中找到不是集合或范围中一个字符就算匹配 | /[^0-9A-z]/.test('aaa111') 得到false |
[0-9] [A-Z] [A-z] [a-z] | 查找任何从某个字符到某个字符的字符 注:-表示范围,从某个字符到某个字符,在字符串中找到范围中一个就算匹配 | /[0-9A-z]/.test('aaa111') 得到true |
(red|blue|green) | 查找任何指定的选项 注:多项中的某一项匹配了就算匹配,此处用到圆括号(),如果是方括号,含义就不一样了。 [red|blue|green],表示的是red|blue|green这么多字符中的某一个匹配就算匹配 圆括号的分组作用后续细化 | /(red|blue|green)/.test('blue1red') 得到true |
4. 特殊字符(元字符)
加了反斜杠\,做了转义。
特殊字符 | 说明 | 示例 |
. | 查找单个字符,除了换行\n和行结束符\0 | <略> |
\w | 查找数字、字母及下划线,即[0-9a-zA-Z_]的简写形式 注:w是word-单词的首字母 | <略> |
\W | 查找非单词字符,和\w相反,查找非数字、字母、下划线,即[^0-9a-zA-Z_]的简写形式 | <略> |
\d | 查找数字字符 注:d是digit-数字的首字母 | <略> |
\D | 查找非数字字符 | <略> |
\s | 查找空白字符 | <略> |
\S | 查找非空白字符 | <略> |
\b | \b匹配单词边界,具体就是\w和\W之间的位置,也包括\w和^之间的位置,也包括\w和$之间的位置 注:b是boundary-边界的首字母 | <略> |
\B | \B匹配非单词边界,具体就是\w与\w、\W与\W、^与\W,\W与$之间的位置 | <略> |
\0 | 查找NULL字符 | <略> |
\n | 查找换行符 | <略> |
\f | 查找换页符 | <略> |
\r | 查找回车符 | <略> |
\t | 查找制表符 | <略> |
\v | 查找垂直制表符 | <略> |
\xxx | 查找以八进制数 xxx 规定的字符 注:处理3个8进制数字表示编码的字符 | /\101/.test('A') |
\xdd | 查找以十六进制数 dd 规定的字符 注:处理2个16进制数字表示编码的字符 | /\x41/.test('A') |
\uxxxx | 查找以十六进制数 xxxx 规定的 Unicode 字符 注:处理2个字节表示的字符,不足2字节,高2字节补0,\uxxxx中u需要小写 | /\u6211/.test(‘我’) /\u0041/.test('A') |
5. 量词
- \b-单词的边界位置
- \B非单词的边界位置
- ^字符串起始位置
- $字符串结束位置
- ?=n表示n前面的位置
- ?!n表示不是n前面的位置
量词 | 说明 | 示例 |
n+ | 匹配一个至多个n的字符串 区间 [1, +∞) | /[abc]+/.test('acacb') 得到true |
n* | 匹配零个至多个n的字符串 区间 [0, +∞) | /[abc]*/.test('') 得到true |
n? | 匹配零个或一个n的字符串 区间 [0, 1] | /[abc]?d?/ 可以匹配a,b,c,d,ad,bd,cd |
n{X} | 匹配X个n的字符串 区间 [ X ] | /[abc]{2}/ 可以匹配aa,bb,cc,ab,ba,ac,ca,bc,cb |
n{X, } | 匹配X个至多个n的字符串 区间 [X, +∞) | <略> |
n{X, Y} | 匹配X个至多个n的字符串 区间 [X, Y] | <略> |
n{X, Y}? | 量词后面加个问号就能实现惰性匹配,能匹配到X个就知足 | <略> |
n$ | 匹配任何结尾为 n 的字符串 $匹配字符串结尾的位置。 | /[123]$/ 匹配以1或2或3结尾的字符串 |
^n | 匹配任何开头为 n 的字符串 注:注意和方括号中[^abc]的区别。 ^匹配字符串开头的位置。 | /^[123]/ 匹配以1或2或3开头的字符串 |
?=n | 匹配任何其后紧接指定字符串 n 的字符串 | /ove (?=myself)/.test('i love myself') 匹配后面接myself的子串'ove ' |
?!n | 匹配任何其后没有紧接指定字符串 n 的字符串 注:和?=n相反 | <略> |
6. RegExp原型方法
方法 | 说明 | 示例 |
RegExp.prototype.test | 功能:检索字符串中指定的值 输入:string 输出:boolean,即true | false | /abc/.test('abc') |
RegExp.prototype.exec | 功能:检索字符串中指定的值,返回找到的子串及其位置 输入:string 输出:Array | null [ 0: string 匹配到子串 index: number 匹配到子串索引 input: string, 源字符串 length: number,数组长度 groups: undefined ] | /abc/.exec('abcabc') |
RegExp.prototype.toString | 功能:获取正则表达式字符串 输入:无 输出:string | /abc/.toString() 得到‘/abc/’ |
7. RegExp对象属性
属性 | 说明 | 示例 |
ignoreCase | 实例是否设置修饰符i | /abc/i.ignoreCase 得到‘i’ |
global | 实例是否设置修饰符g | /abc/g.global 得到‘g’ |
multiple | 实例是否设置修饰符m | /abc/m.multiple 得到'm' |
constructor | 实例指向的构造函数 | /abc/.constructor 得到RegExp |
source | 实例的匹配模式 | /abc/.source 得到‘abc’ |
lastIndex | RegExp.prototype.test和RegExp.prototype.exec下一次的检索起始位置 可读写,开发可以设置,test和exec也会设置, 可以用于连续匹配场景 | 仅修饰符设置‘g’才可以用 const reg = /abc/; reg.test('abcabc') reg.lastIndex |
8. 使用正则表达式的String原型方法
方法 | 说明 | 示例 |
String.prototype.search(searchVal) | 功能:检索匹配searchVal的位置索引(此处修饰符g无效) 输入:RegExp | string 输出:number | -1 | let str = 'My dream and her dream' let index = str.search(/dream/g) |
String.prototype.match(regexp) | 功能:根据regexp匹配子串,将所有匹配的字符串构成数组返回,修饰符g返回所有匹配子串数组,不加修饰符g,和RegExp.prototype.exec()方法返回结果一样 输入:RegExp | string 输出:Array<string> | null | 'afbgc'.match(/[abc]+/g) |
String.prototype.replace(searchVal, newVal) | 功能:用newVal替换匹配的子串(替换所以匹配的,正则表达式需要加修饰符g) 输入:RegExp | string 输出:string | let str = 'My dream and her dream' let newStr = str.replace(/dream/g, 'computer') 得到 'My computer and her computer' |
String.prototype.split(separator, limit) | 功能:根据separator,将字符串拆成字符串数组 输入:RegExp | string 输出:Array<string> | let str = 'My dream and her dream' let newStr = str.slit(/dream/g) 得到数字 ['My ', ' and her ', ''] |
笔者感觉这篇写正则表达式的文章,很不错,推荐给大家:JS正则表达式完整教程(略长) - 掘金 (juejin.cn)
下一篇:【ECMAScript】String对象属性和方法梳理和总结(第二篇)-优快云博客
注:以上,如有不合理之处,还请帮忙指出,大家一起交流学习~