正则表达式
正则RegExp
正则表达式也叫规则表达式,使用一些特定的符号来组合成一个表达式,使用这个表达式去验证字符串是否符合规则(匹配),或者从字符串里面获取一些符合规则的内容(捕获)。例如:var reg = /abcd/ 正则表达式就是要验证字符串里是否包含一段abcd字母。
创建
- 字面量形式创建
- 语法:
const regex = /foo/gtypeof => 'object' - 不能进行字符串拼接,字符串拼接完毕就变成了字符串不是正则,不能使用test和exec方法
- 书写基础元字符的时候直接写\x
- 语法:
- 内置构造函数创建
- 语法:
const regex = new RegExp('foo*')typeof => 'object' - 可以进行字符串拼接,因为RegExp的第一个参数就是传递一个字符串类型
- 书写基础元字符的时候需要写\x
- 语法:
标识符
标识符是写在正则表达式的外面,用来修饰整个正则表达式的const reg = /abcd/igy或const reg = new RegExp('abcd', 'igy')。
-
i:忽略大小写。
-
g:全局。匹配或捕获的时候,都是只能找到第一个。当他有全局标识符的时候,你捕获第二次会从第一次的结束位开始查找,直到找不到了返回null,再后面依次的时候,又回到[0]位置开始捕获。匹配和捕获都是影响下一次开始位的。
-
y:粘性全局。第一次必须是从[0]位置就刚好能捕获到内容,第二次必须是从第一次结束位开始就刚好能捕获到内容才可以。
转义符
字符串里的转义字符也是\:
- 当你在字符串里书写n的时候表示文本n,当书写\n的时候表示换行的意思;
- 当你在字符串里书写\s的时候,他会把s转换成有意义的内容,但是\s确实没有实际意义,就变成了一个普通文本;
- 当你在字符串里书写\的时候表示转义符号,当你在书写\的时候,表示一个\文本;
作用
- 匹配:验证字符串是否符合规则;
- 语法:正则.test(你要检测的字符串)
const str = 'table football';const regex = new RegExp('foo*');//该regex的意思表示字符串str里面需要有一个foo*片段 - 返回值:一个布尔值,true或者false
console.log(regex.test(str)); // expected output: true
- 语法:正则.test(你要检测的字符串)
- 捕获:从字符串里面获取符合正则规则的那一部分片段;
- 语法:正则.exec(你要捕获的字符串)
- 返回值:
- 字符串里面没有符合规则的片段时返回:null
- 字符串里有符合规则的片段-基础捕获:返回值是一个数组,其中[0]是捕获出来的片段(不管有多少片段,都只捕获第一个片段;不管捕获多少次,都是第一个片段)
- 字符串里有符合规则的片段-()捕获:返回值是一个数组,从索引[1]开始依次是每一个小括号的单独捕获
- 字符串里有符合规则的片段-g标识符:第二次捕获会从第一次捕获的结束为开始继续向后查找,直到找不到了位置返回null,再后面依次捕获,依旧会从[0]位置开始查找
元字符
元字符-基础元字符
元字符:组成正则的基本符号。以符号的形式来代替文本内容,把所有的文本内容归结成一些符号来代替。
- \s:表示一个空格
- \S:表示一个非空格
- \t:表示一个制表符
- \d:表示一个数字字符
- \D:表示一个非数字字符
- \w:表示包含一个数字或字母或下划线字符
- \W:表示包含一个非数字或字母或下划线字符
- 点(.):表示非换行的任意字符
- 斜线():表示转义符(把没有意义的内容转换成有意义的内容;把有意义的内容转换成没有意义的内容。例如s单纯表示字母s,\s就表示空格了;.表示非换行的任意字符,.表示字符.;\表示转义字符,\才表示斜线)
元字符-边界元字符
- ^:表示字符串开始
- $:表示字符串结尾
元字符-限定元字符
限定元字符写在普通元字符或者字母符号的后面,修饰前面一个符号的出现次数。
- *:表示0到多次
- +:表示1到多次
- ?:表示0或1次
- {n}:表示n次
- {n,}:表示n到多次
- {n,m}:表示n到m次
贪婪和非贪婪(?)
当你给一个符号使用限定符的时候,在你捕获的时候,他会尽可能多的去捕获内容,我们管这个特性叫做正则的贪婪性。const reg = /\d+/
正则在捕获的时候尽可能的按照最小值来捕获,写限定符的时候,在后面多加一个**?表示非贪婪**。const reg = /\d+?/;其中,+?是一个字符。
- *?
- +?
- ??
- {n}?
- {n,}?
- {n,m}?
元字符-特殊字符
- ():一是代表一个整体
const reg = /(abcd){2}/; // => 匹配abcdabcd;再有就是单独捕获(在你捕获一个字符串的时候,从左边开始每一个小括号依次是数组里面的[1]开始的内容,从左到右依次数小括号的开始括号)const reg = /(\d+(\s+))(\d+)/; - (?:):整体匹配但不捕获,只是标志一个整体,但是捕获的时候不会单独捕获出来;
const reg = /\d+(?:\s+\d+){2}/; reg.exec('123 123 123'); - |:占位或,表示左边或者右边的都行,大部分时候和()连用表示一个整体或一个整体,或分开的是左边的整体或右边的整体
const reg = /(abc|def)/``const reg = /^abc|def$/; - []:一个[]占一个字符位置,表示里面的任意一个都行
- [^]:一个[^]占一个字符位置,表示非里面的任意一个都行
- -:表示至或者到,是使用在[]里面的一个字符,表示从哪一个到哪一个字符,前提是他们在他们在ASCII码里是挨着的。
组合形式:
- [0-9a-zA-Z_]:等价于\w
- [^0-9a-zA-Z_]:等价于\W
- [0-9]:等价于\d
- [^0-9]:等价于\D
- [ ]:等价于\s
- [^ ]:等价于\S
特殊说明: 当点(.)出现在[]或者[^]里面的时候,表示一个点文本,不再表示非换行符
重复出现
\num:num是一个正整数,例如\1 \2 \3...,num是一个数字,表示的是正则第num个可被捕获的() 这个可被捕获的小括号位置是什么 出现 一份 一模一样的内容
// \1 表示重复出现第一个()一模一样的内容一遍
const reg = /(abc|def)\d+\1/
reg.test('abc123abc') // true
reg.test('abc123def') // false
预查
正向预查
正向肯定预查
当我在捕获一个内容的时候,后面必须跟着是我选择的某一个才行(?=)
正向否定预查
当我在捕获一个内容的时候,后面必须跟着不是我选择的某一个才行(?!)
负向预查
负向肯定预查
当我在捕获一个内容的时候,前面必须是我选择的一个才可以(?<=)
负向否定预查
当我在捕获一个内容的时候,前面必须不是我选择的某一个才行(?<!)
例子
‘ES2015 ES2016 ES2017 都是 JavaScript 的语法标准’
1.正向肯定预查:我要捕获 后面必须写着 2015 或者 2016 的ES,字符串是 ES2015 或者 ES2016 是可以捕获的,但是我只捕获 ES 不需要 2015 或者 2016 const reg = /ES(?=2015|2016)/
字符串和正则合作的方法
这些方法都是字符串的常用方法,只不过参数位置可以写正则。
- search()
- 语法:
- 字符串.search(字符串片段)
- 字符串.search(正则表达式)
- 返回值:
- 如果有就是对应的索引
- 如果没有就是-1
- 语法:
- replace()
- 语法:
- 字符串.replace(字符串片段,要替换的内容)
- 字符串.replace(正则表达式,要替换的内容)
- 返回值:
- 为字符串片段时:只能替换第一个查找到的内容,返回替换好的字符串
- 为正则时:如果没有全局标识符g的时候,只能替换第一个查找到的内容,返回替换好的字符串;有全局标识符g的时候,会把字符串内所有满足正则规则的内容全部替换,返回替换好的字符串
- 语法:
- match()
- 语法:
- 字符串.match(字符串片段)
- 字符串.match(正则表达式)
- 返回值:
- 为字符串片段时:查找到字符串内一个满足字符串片段的内容返回,返回格式和exec一模一样
- 为正则时:如果没有全局标识符g的时候,返回值和exec方法一模一样;有全局标识符g的时候,返回一个数组,里面是所有满足条件的内容
- 语法:
正则匹配中文
在正则表达式里面\u表示查找中文,后面带上中文的四位unicode编码,[\u4e00-\u9fa5]表示任意一个中文字符。