【js正则表达式】从零开始的正则表达式教学一:基础表达式

正则表达式(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+匹配到了124233,并把它们替换成&

"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  匹配字母和数字

本系列将从易到难持续更新,欢迎关注订阅。

上一篇:用Symbol.iterator实现可迭代的对象
下一篇:从零开始的正则表达式教学(二)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值