1、什么是正则表达式
正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个字符串是否含有某种子串、将匹配的子串做替换或者从某个字符串中取出符合某个条件的子串等。
2、创建方式
- 字面量创建方式
- 构造函数创建方式
// 字面量创建
const reg = /pattern/flags
// 构造函数创建
const reg = new RegExp(pattern, flags)
// pattern:正则表达式
// flags 修饰符
const reg1 = new RegExp('\\d') // 需要转义
const reg2 = /\d/
常见修饰符
- i 忽略大小写匹配
- m 多行匹配,即在到达一行文本末尾时还会继续寻常下一行中是否与正则匹配的项
- g 全局匹配 模式应用于所有字符串,而非在找到第一个匹配项时停止
3、特殊含义的元字符
- \d : 0-9之间的任意一个数字 \d只占一个位置
- \D : 除了\d
- \w : 数字、字母、下划线、0-9、a-z A-Z _
- \W : 除了\w
- \s : 空格或者空白等
- \S : 除了\s
- . : 除了\n之外的任意一个字符
- \ : 转义字符
- | : 或者
- () : 分组
- \n : 匹配换行符
- \b : 匹配边界 字符串的开头和结尾 空格的两边都是边界 => 不占用字符串位数
- ^ : 限定开始位置 => 本身不占位置
- $ : 限定结束位置 => 本身不占位置
- [a-z] : 任意字母 []中的表示任意一个都可以
- [^a-z] : 非字母 []中^代表除了
- [abc] : abc三个字母中的任何一个 [^abc]除了这三个字母中的任何一个字符
4、量词元字符
- '*' : 0到多个
- '+' : 1到多个
- '?' : 0次或1次 可有可无
- {n} : 正好n次
- {n,} : n到多次
- {n,m} : n次到m次
量词出现在元字符后面 如\d+,限定出现在前面的元字符的次数
const str = '1234567890'
const reg = /\d{2}/g
const res = str.match(reg)
console.log(res)
// [ '12', '34', '56', '78', '90' ]
const str1 =' 去除空格 '
const reg1 = /^\s+|\s+$/g
const res1 = str1.replace(reg1,'')
console.log(`(${res1})`)
// (去除空格)
5、正则中的[]
一般[]中的字符没有特殊含义 如+就表示+ 但是像\w这样的还是有特殊含义的
let str1 = 'abc';
let str2 = 'dbc';
let str3 = '.bc';
let reg = /[ab.]bc/; //此时的.就表示.
reg.test(str1) //true
reg.test(str2) //false
reg.test(str3) //true
[]中,不会出现两位数,[12]表示1或者2 不过[0-9]这样的表示0到9 [a-z]表示a到z
// 例如:匹配从18到65年龄段所有的人
let reg = /[18-65]/
reg.test('50')
// Uncaught SyntaxError: Invalid regular expression: /[18-65]/: Range out of order in character class
// 实际上我们匹配这个18-65年龄段的正则我们要拆开来匹配,我们拆成3部分来匹配 18-19 20-59 60-65
reg = /(18|19)|([2-5]\d)|(6[0-5])/
()有提高优先级功能,因此凡是有|出现的时候,要注意是否有必要加上()来提高优先级
6、分组
分组:在正则表达式中用()包起来的内容代表了一个分组
const reg = /I come from (hunan|hubei|zhejiang)/;
reg.test('I come from hunan'); //true
reg.test('I come from hubei'); //true
分组的分类:
- 捕获型 ()
- 非捕获型 (?:)
- 正向前瞻型 (?=)
- 反向前瞻型 (?!)
我们使用的比较多的都是捕获型分组,只有这种分组才会暂存匹配到的字符串
捕获型分组
捕获与引用: 被正则表达式捕获(匹配)到的字符串会被暂存起来,其中,由分组捕获到的字符串会从1开始编号,
let reg = /(\d{4})-(\d{2})-(\d{2})/
let dateStr = '2018-04-18'
reg.test(dateStr)
console.log(RegExp.$1)
console.log(RegExp.$2)
console.log(RegExp.$3)
let dateStr = '2018/04/18';
let reg = /(\d{4})\/(\d{2})\/(\d{2})/;
dateStr = dateStr.replace(reg, '$1-$2-$3')
console.log(dateStr)
正则表达式里也能进行引用,这称为反向引用
let reg = /(\w{3}) is \1/
// 解释:reg中的 \1表示分组匹配到的第一个字符串
reg.test('kid is kid')
// true
reg.test('dik is dik')
// true
reg.test('kid is dik')
// false
reg.test('dik is kid')
// false
如果引用了越界或者不存在的编号的话,就被解析为普通的表达式
let reg = /(\w{3}) is \6/;
reg.test( 'kid is kid' )
// false
reg.test( 'kid is \6' )
// true
7、正则运算符的优先级
正则表达式从左到右进行计算,并遵循优先级顺序,相同优先级的会从左到右进行运算,不同优先级的运算先高后低
- 常见的运算符的优先级排列,从最高到最低
- \ : 转义符
- (), (?:), (?=), [] : 圆括号和方括号
- *, +, ?, {n}, {n,}, {n,m} :量词限定符
- ^, $, \任何元字符、任何字符
网友评论