1、基础语法
用来处理字符串的规则
- 只能处理字符串的
- 它是一个规则:可以验证字符串是否符合某个规则,也可以把字符串中符合规则的内容捕获到
1.1、创建正则
使用一个正则表达式字面量,其由包含在斜杠之间的模式组成
var re = /d+/;
调用RegExp
对象的构造函数 ,两个参数一个是元字符字符串,一个是修饰符字符串
var re = new RegExp("\d+");
这两种还是有点语法区别
- 构造函数因为传递的是字符串,需要写两个才代表斜杠
正则表达式由两部分构成
- 元字符(//在两个斜杠中间的叫元字符)
- 修饰符
1.2、元字符
1.2.1、量词元字符
设置出现的次数
元字符 | 含义 |
---|---|
***** | 零到多次 |
+ | 1到多次(在[]中就代表+号) |
? | 零或者1次 |
{n} | 出现n次 |
{n,} | 出现n到多次 |
{n,m} | 出现n到m次 |
1.2.2、特殊元字符
单个或者组合在一起代表特殊含义的
元字符 | 含义 |
---|---|
转义字符 | |
. | 除 (换行符)以外的任意字符 |
^ | 以哪一个元字符作为开始 |
$ | 以哪一个元字符作为结束 |
换行符 | |
d | 0-9之间的数字 |
D | 匹配一个非数字字符 (大写和小写的意思是相反的) |
w | 数字,字母,下划线中的任意一个字符 |
s | 一个空白字符(包含空格,制表符,换页符等) |
一个制表符(一个TAB键:4个空格) | |
匹配一个单词的边界 | |
x|y | x或者y |
[xyz] | x或者y或者z中的 |
[^xy] | 除了x/y以外的任意字符 |
[a-z] | 指定a-z这个范围的任意字符 |
[^a-z] | 除了小写a-z的字符 |
() | 正则中的分组符号 |
(?:) | 只匹配不捕获 |
(?=) | 正向预查 |
(?!) | 负向预查 |
1.2.3、普通元字符
代表普通含义
/zhuzhe/ 只匹配zhuzhe
1.3、修饰符
符号 | 含义 |
---|---|
i | 忽略大小写匹配 |
m | 忽略换行匹配(多行匹配) |
g | 全局匹配 |
1.4、常用正则
var re= /[xy]/
re.test('xy') //true
var re= /^[xy]$/
re.test('xy') //false
//在[]里面+号就表示普通的+号,但是d在[]还是0-9
var re=/^[@+]$/
re.test('+') //true
//[]中不存在多位数
var re=/^[10-29]$/ //这个并不是表示10-29,表示1或者0-2或者9
常用的正则表达式
1.4.1、验证是否为有效数字
/*
*1、可以出现+-号,也可以不出现
2、一位0-9都可以,多位首位不能为0
3、小数部分可能有可能没有,一旦有后面必须有小数点+数字
? 0或者1
+ >=1次
小数点要转义
*/
var re=/^[+-]?(d|([1-9]d+))(.d+)?$/
1.4.2、验证密码
/*
*1、 数字,字母,下划线
2、 6-16位
w 数字,字母,下划线中的任意一个字符
*/
var re=/^w{6,16}$/
1.4.3、验证真实姓名
/*
* 1. 尼古拉斯.赵四
2. 名字长度2-10位,有译文 .汉字
汉字匹配 [u4e00-u9fa5]
*/
var re=/^[u4e00-u9fa5]{2,10}(.[u4e00-u9fa5]{2,10})*?$/ //这个.写错了
1.4.4、邮箱验证
var reg = /^w+((-w+)|(.w+))*@[A-Za-z0-9]+((.|-)[A-Za-z0-9]+)*.[A-Za-z0-9]+$/
1.4.5、身份证验证
var reg=/^d{17}(d|X)$/
1.5、正则的捕获
- 正则RegExp.prototype的方法
- exec
- test
- 字符串String.prototype上支持正则表达式处理的方法
- replace
- match
- split
- search
- matchAll
1.5.1、 exec(正则方法)
**exec()**
方法在一个指定字符串中执行一个搜索匹配。返回一个结果数组或 null
。
index:当前捕获内容在字符串的起始索引
input;原始字符串
正则捕获的懒惰性:每执行一次只能捕获到一个符合正则规则,但是默认情况下,执行多次获取的结果永远都是第一个匹配的,其他的永远匹配不到
当全部捕获时,再次捕获的结果是null
RegExpObject.exec(string)
-
实例1
lastIndex:当前正则下一次匹配的起始索引位置(正则的属性),默认是0
var str="I love antzone ,this is animate"; var reg=/an/; console.log(reg.exec(str)); /* ["an", index: 7, input: "I love antzone ,this is animate", groups: undefined] */ var str="I love antzone ,this is animate"; var reg=/an/g; var myArray; while ((myArray = reg.exec(str)) !== null) { var msg = 'Found ' + myArray[0] + '. '; msg += 'Next match starts at ' + reg.lastIndex; console.log(msg); } //Found an. Next match starts at 9 //VM349:7 Found an. Next match starts at 26
-
实例二:
var str="I love antzone ,this is animate";
//这里不加g,会死循环,不然每次都是从第一个开始捕获
var reg=/an/g;
console.log(reg.exec(str));
//加了这句话,就可以找完所用的 an
reg.lastIndex;
console.log(reg.exec(str));
/*
*["an", index: 7, input: "I love antzone ,this is animate", groups: undefined]
["an", index: 24, input: "I love antzone ,this is animate", groups: undefined]
*/
1.5.2、test(正则方法)
**test()**
方法执行一个检索,用来查看正则表达式与指定的字符串是否匹配。返回 true
或 false
。
var re=/an/;
console.log(re.test('asada')) //fasle
console.log(re.test('asanda')) //true
//是否在最开始
let str = 'hello world!';
let result = /^hello/.test(str);
console.log(result);
// true
注意:test会改变正则表达式的lastIndex, (exec()
同样改变正则本身的 lastIndex属性值
).
1.5.3、 match
(字符串方法)
match()
方法检索返回一个字符串匹配正则表达式的的结果
1、正则表达式不包含
g
标志,str.match()
将返回与RegExp.exec()
. 相同的结果。2、用法都要加g,不加g就没意义,
3、找不到返回null,找到返回找到值的数组
-
语法
str.match(regexp)
-
实例
var re = /d/ var str = "2018abc2019dad2020asas" console.log(str.match(re)) // ["2", index: 0, input: "2018abc2019dad2020asas", groups: undefined] var re = /d/g var str = "2018abc2019dad2020asas" console.log(str.match(re)) // ["2", "0", "1", "8", "2", "0", "1", "9", "2", "0", "2", "0"] var re = /d+/g var str = "2018abc2019dad2020asas" console.log(str.match(re)) // ["2018", "2019", "2020"] var re = /an/g var str = "2018abc2019dad2020asas" console.log(str.match(re)) // null
"http:/www.baidu.com/?a=1&b=2".match(/([^?&=]+)=([^?&=]*)/g); //["a=1", "b=2"]