正则表达式(regular expression)
描述了一种字符串匹配的模式(pattern)
,可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。
本系列从易到难分许多篇,对正则表达式比较熟悉的,可以忽略本篇。
正则表达式有两种定义方式:
//1.通过构造函数new出来,需要用\对\进行转义,所以代表数字的\d在参数里要写成 \\d
var reg = new RegExp("\\d")
reg.test(123)
>> true
//2.通过字面量书写,用/****/包裹
var reg = /\d/
reg.test(123)
>> true
后边统一使用字面量书写。
1.匹配数字:\d
和[0-9]
都可以用来匹配数字,那么前边的示例可以写成:
var reg = /[0-9]/
reg.test(123)
>> true
test
用来查找参数内,是否存在符合正则表达式字符串的片段,如果存在,返回true
,不存在返回false
。
看这个例子:
var reg = /\d/
reg.test("abc")
>> false
reg.test("abc124")
>> true
^
符号有两个用途:
1.用在[ ]
内,表示不包含[ ]内的字符;
2.用在正则表达式的开头,表示匹配的字符串必须以这个正则表达式表示的内容为开头;
来看示例:
var reg = /[^0-9]/
reg.test("abc124")
//匹配到了a,a不是数字,返回true
>> true
reg.test("abc")
//匹配到了a,a不是数字,返回true
>> true
reg.test("124")
//从1开始匹配,是数字,进入下一个字符2,也是数字,继续下一个字符4,也是数字
//结果:没有找到不是数字的字符,结束,返回false
>> false
reg.test("123abc")
//从1开始匹配,是数字,进入下一个字符2,也是数字,继续下一个字符4,也是数字
//继续查找,找到了a,不是数字,查找结束,返回true
>> true
可以看到上述示例中,只要字符串含有不是数字的字符,结果就返回true
。那么怎么才能让所有的字符都不是数字呢?使用^
和$
,^
代表匹配以它后边的内容为开头的字符串,$
代表匹配以它前边的内容为结尾的字符串,^
和$
同时使用时,表示所有的字符必须都符合他俩之间的表达式才行。
/^[^0-9]$/.test("abc124adb")
>> false
>/^[^\d]$/.test("abc124adb")
>> false
可以把\d
换成\D
,\d
代表匹配数字,\D
代表匹配非数字:
/^\D*$/.test("abc123adb")
>> false
2.返回匹配到的数字:
"abc124adb".match(/\d/)
>> ['1', index: 3, input: 'abc124adb', groups: undefined]
字符串方法match
传入正则表达式,返回了匹配到的第一个数字的内容和其他属性,数组第一个值是匹配到的内容,第二个值是匹配到的内容在字符串的位置。
var arr = "abc124adb".matchAll(/\d/g)
console.log([...arr])
>> [
>> ['1', index: 3, input: 'abc124adb', groups: undefined],
>> ['2', index: 4, input: 'abc124adb', groups: undefined],
>> ['4', index: 5, input: 'abc124adb', groups: undefined]
>> ]
字符串方法matchAll
传入正则表达式,返回匹配到的所有的字符串的可迭代对象RegExpStringIterator
,可以用for
循环或者...
来获取每一项。
"abc124adb".match(/\d/g)
>> ['1', '2', '4']
正则表达式后边加 g
,代表全局匹配,匹配到任何内容记录下来并继续,直到匹配完整个字符串。这里match
返回了所有匹配到的内容组成的数组。
"abc124adb233".match(/\d+/g)
>> ['124', '233']
这里 \d
后边加了+
号,代表匹配1个以上的数字,直到遇到不是数字的。把+
号换成*
号,代表匹配0个以上的数字,直到遇到不是数字的。
var reg = /\d/g , str = "abc124adb233"
undefined
reg.exec(str)
>> ['1', index: 3, input: 'abc124adb233', groups: undefined]
reg.exec(str)
>> ['2', index: 4, input: 'abc124adb233', groups: undefined]
reg.exec(str)
>> ['4', index: 5, input: 'abc124adb233', groups: undefined]
reg.exec(str)
>> ['2', index: 9, input: 'abc124adb233', groups: undefined]
reg.exec(str)
>> ['3', index: 10, input: 'abc124adb233', groups: undefined]
reg.exec(str)
>> ['3', index: 11, input: 'abc124adb233', groups: undefined]
reg.exec(str)
>> null
exec
方法是一个正则表达式方法。exec
方法用于检索字符串中的正则表达式的匹配。
该函数返回一个数组,其中存放匹配的结果。如果未找到匹配,则返回值为 null
。当正则表达式加了g进行全局匹配时,exec每次执行都会查找并返回下一个符合要求的字符串。如果没有全局匹配的g,则每次执行总是返回第一个符合要求的字符串。如下代码:
var reg = /\d/ , str = "abc124adb233"
undefined
reg.exec(str)
>> ['1', index: 3, input: 'abc124adb233', groups: undefined]
reg.exec(str)
>> ['1', index: 3, input: 'abc124adb233', groups: undefined]
reg.exec(str)
>> ['1', index: 3, input: 'abc124adb233', groups: undefined]
3.把匹配到的数字换成指定的其他字符:
"abc124adb233".replace(/\d/,"&")
>> 'abc&24adb233'
字符串方法replace
匹配到了第一个数字1
,把他替换成了&
并且返回。
"abc124adb233".replace(/\d/g,"&")
>> 'abc&&&adb&&&'
正则表达式后边加g
,表示全局匹配数字并且替换成&
。
"abc124adb233".replace(/\d+/g,"&")
>> 'abc&adb&'
\d+
匹配到了124
和233
,并把它们替换成&
。
"abc124adb233".replace(/\d{2}/g,"&")
//首先匹配到12,替换成&。接着匹配到4,但是后边是a,不是数字,舍弃并且不替换。
//接着匹配到了23,替换成&,最后匹配到3,因为后边没有内容,不符合2个数字的结构,也舍弃不替换。
>> 'abc&4adb&3'
"abc124adb233".replace(/\d{1,2}/g,"&")
//首先匹配到了12,符合1-2比较大的2,替换成了&。接着匹配到了4,符合1-2里边的1,替换成了&。后边同理。
>> 'abc&&adb&&'
"abc124adb233".replace(/\d{4}/g,"&")
//没有匹配到4个连续的数字,不替换,返回原字符串
>> 'abc124adb233'
"abc124adb233".replace(/[^\d]/g,"&")
//匹配到所有的非数字并且替换成&
>> '&&&124&&&233'
{ }
可以传入两个值,{2}
代表匹配2个以上的字符,0个或1个匹配不到;{1 , 2}
代表匹配1-2个字符,3个以上匹配不到,同时满足时,取最大值;{ , 2}
代表匹配2个以下的字符,3个以上匹配不到。
关于数字的常用正则表达式:
/(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/ 匹配大陆身份证号
/^1[3-9]\d{9}$/ 匹配手机号
/^([0-9]{1}|^[1-9]{1}\d{1,15})(\.\d{1,2})?$/ 匹配可以精确到小数点后两位的金额
/^[0-9a-zA-Z]*$/g 匹配字母和数字