什么是正则表达式
正则表达式是一种规则,而这种规则能够匹配字符串的一种匹配模式,专门为简化字符串操作而生的
正则表达式的创建方式 字面量形式
var reg = /2/;//创建正则表达式(字面量形式)
console.log(reg)
正则表达式是由,两波反斜杠包裹的数据/2/
那么正则表达式,是什么数据类型的呢??
var reg = /2/;
console.log(typeof reg)//检查正则表达式的数据类型
object
说明了正则表达式是一个对象
正则是一个引用数据类型, typeof 正则 --> 'object'
正则表达式的方法和属性
reg.test(str)
检测str中有没有符合reg的规则
var reg = /e/;
var str = 'huasheng';
console.log(reg.test(str));
var reg = /e/;
console.log(reg.test("acdp"));
不仅仅规则可以写单个字母,还可以写验证规则用在test
方法上
var reg = /(h|g)e/;//|号表示或者的意思
//这个规则的意思是匹配he或者是ge
var str = 'huasheng';
console.log(reg.test(str));
reg.test
(字符串) 检验字符串中有没有reg
对应的规则
- 如果有 则返回
true
- 如果没有 则返回
false
str.match
(正则) 按照指定的正则规则 匹配出str
中的符合规则的字符
var str = /n/;
var reg = "huashengn";
console.log(reg.match(str));
str.match()
的方法返回的是一个数组,他的第一项表示匹配出来的数据,第二项index
表示匹配出来的数据在索引几,第三项input
表示你匹配的原始字符串
str.match
(正则) 字符串方法
- 按照指定的正则规则 匹配出
str
中的符合规则的字符 - 如果没有匹配出来 则返回
null
正则的修饰符
i
忽略大小写
var str = /Hu/i;//规则
var reg = "huasheng";//要检验的字符串
console.log(str.test(reg))
用str
验证reg
中有没有Hu
字母,/
杠后面的i
表示在查询对应的规则时忽略大小写,给过是true
g
全局匹配
var str = /h/g;//规则
var reg = 'huasheng';//要检验的字符串
console.log(reg.match(str));
用str
检查reg
中有没有h字母,/
杠后面的g
表示在查询对应的规则时并全局匹配,给过是["h", "h"]
g
全局匹配 和 i
忽略大小写 可以同时写,如:
var str = /h/ig;//匹配规则
var reg = "HuahsHeng";//要匹配的字符串
console.log(reg.match(str));
用str
检查reg
中有没有h
字母,/
杠后面的i
和g
表示在查询对应的规则时并忽略大小写和全局匹配,给过是["H", "h", "H"]
总结
- 正则的修饰符 修饰符的顺序可以颠倒
i
忽略大小写i
是取ingorecase
单词的首字母g
全局匹配 g是取global
单词的首字母
表达式
表达式作用:表示的是字符串的区间
[a-z]
表示a-z中的任何一个数据
var str = /[a-z]/g;//正则表达式,并全局匹配
var reg = "h1u2s3";//要匹配的字符串
console.log(reg.match(str));
用str
检查reg
的字符串,匹配出来的数据是[a-z]
的字母不包含别的数据,并且全局匹配,结果是["h", "u", "s"]
。
[acde]
表示acde中的任何一个数据
var src = /[abd]/g;//要匹配的条件
var tag = "huasheng";//要匹配的字符串
console.log(tag.match(src));
用str
检查reg
的字符串,匹配出来的数据是[acde]
的字母不包含别的数据,并且全局匹配,结果是["a"]
。
[^acde]
表示除了acde中的任何一个数据
var src = /[^hse]g/;//要匹配字符串的规则
var reg = "huasheng";//要匹配的字符串
console.log(reg.match(src));
用str
检查reg
的字符串,匹配出来的数据是除了[acde]
的字母不包含别的数据,并且全局匹配,结果是["u", "a", "n", "g"]
。
还可以用许多形式写正则表达式
[acde]
表示acde中的任何一个数据[^acde]
表示除了acde中的任何一个数据[a-z]
表示a-z中的任何一个数据[A-Z]
表示A-Z中的任何一个数据[A-z]
表示A-z中的任何一个数据[0-9]
表示0-9中的任何一个数据[\u67d7\u65d7\u00d1\u5d08]
表示对应unicode编码的任意一个中文字符
元字符
元字符本质也是表达式,也是用来表示字符的区间,注意元字符也只能匹配一个字符
\w
表示 [0-9A-z_]
中的任何一个数据
var str = 'hus2h7ng_';//要匹配的字符串
var reg = /\w/g;//匹配字符串的条件
console.log(str.match(reg));
用str
检查reg
的字符串,匹配出来的数据是[0-9A-z_]
的字母和_
不包含别的数据,并且全局匹配,结果是["h", "u", "s", "2", "h", "7", "n", "g", "_"]
。\w
是word英文的简写
\W
表示除了 [0-9A-z_]
中的任何一个数据
var str = 'hus2h7n g_';//要匹配的字符串
var reg = /\W/g;//匹配字符串的条件
console.log(str.match(reg));
用str
检查reg
的字符串,匹配出来的数据是除了\w
的元字符不包含别的数据,并且全局匹配,结果是[" ", " ", " "]
。
\d
表示 [0-9]
中的任何一个数据
var str = 'hus2h7ng_';//要匹配的字符串
var reg = /\d/g;//匹配字符串的条件
console.log(str.match(reg));
用str
检查reg
的字符串,匹配出来的数据是\d
的元字符不包含别的数据,并且全局匹配,结果是["2", "7"]
。\d
是digital英文单词的简写
\D
表示不是 [0-9]
中的任何一个数据
var str = 'hus2h7ng_';//要匹配的字符串
var reg = /\D/g;//匹配字符串的条件
console.log(str.match(reg));
用str
检查reg
的字符串,匹配出来的数据是除了\d
的元字符不包含别的数据,并且全局匹配,结果是["h", "u", "s", "h", "n", "g", "_"]
。
\s
表示匹配中能够使字符串产生间隙的字符 ([\n\f\r\t\v ]
都能让字符串产生间隔)
var str = 'hns2 h7 ng_';//要匹配的字符串
var reg = /\s/g;//匹配字符串的条件
console.log(str.match(reg));
用str
检查reg
的字符串,匹配出来的数据是除了能让字符产生间隙的字符(空格键和Tab键),不包含别的数据,并且全局匹配,结果是[" ", " "]
。 \s
是space英文的简写
\S
表示匹配中不能,使字符串产生间隙的字符
var str = 'hns';//要匹配的字符串
var reg = /\S/g;//匹配字符串的条件
console.log(str.match(reg));
用str
检查reg
的字符串,匹配出来的数据是除了不能让字符串产生间隔的字符,不包含别的数据,并且全局匹配,结果是["h", "n", "s"]
。
.
表示匹配除了换行之外的字符**
var str = 'hn\ns';//要匹配的字符串
var reg = /./g;//匹配字符串的条件
console.log(str.match(reg));
用str
检查reg
的字符串,匹配出来的数据是除换行符之外的所有字符,不包含别的数据,并且全局匹配,结果是["h", "n", "s"]
。
量词
无论 表达式还是元字符,都只能匹配到一个字符,无法匹配多个字符,所以引入量词的概念,用来设置匹配到字符的个数
var str = "huasheng";
var reg = /\w{2}/;//量词是用花括号来写的,里面写数量
//表示匹配了2个在\w剧中的字符
console.log(str.match(reg));
那么用g
全局匹配呢???
情况一
var str = "huasheng";
var reg = /\w{2}/g;//会匹配指定个数在字符区间中的字符
console.log(str.match(reg));
那么就会匹配到了hu还不够,有让我全局匹配as,he,ng
,那匹配出来的结果是…
每一次匹配都会匹配到2个字符,因为你在花括号里面给了数量了,如果不给数量的话,那么也会全局匹配,第一次只能匹配出来一个字符然后一次往下匹配。
情况二
var str = "huasheng";
var reg = /\w{5}/g;
console.log(str.match(reg));
那么你指定的个数,不满足匹配字符串的倍数呢??
那会先匹配前面符合字符的个数,即使全局匹配了也没有用
那么能不能匹配2-3个字符呢??
var str = "hu12as34he567ng";
var reg = /\d{2,3}/g;//那么这样写会匹配到2个或者3个字符
console.log(str.match(reg));
当使用量词的时候,2个字符或者是3个字符,当满足条件的时候,那么就会贪婪匹配(尽可能多的匹配),当每次匹配的时候就会尽可能多的匹配。每次匹配的时候满足规则就能够去3个的时候决不取2个(当满足点前规则的时候尽可能多的匹配)
那么遇到{2,}
这种情况的结果是什么呢
var str = "hu123g45677y55i";
var reg = /\d{2,}/g;
console.log(str.match(reg));
那么当你每次匹配的时候至少匹配2个字符
那该怎么匹配至少一个字符 呢??
var str = "hu123g45677y55i";
var reg = /\d+/g;//表示匹配数量,至少一个,他会匹配到一个符号条件的时候会贪婪匹配
console.log(str.match(reg));
那该怎么匹配至少0个字符 呢??
var str = "hu123g45677y55i";
var reg = /\d*/g;//*表示至少0个数字
console.log(str.match(reg));
x?
匹配[0,1]
个字符
var str = "hu123g45677y55i";
var reg = /\d?/g;//*表示至少0个数字
console.log(str.match(reg));
那么只要牵扯出来匹配0个字符,那么肯定会有很对空串出来的,那么牵扯到0的不常用。
那么该怎么取消贪婪匹配呢??
var str = "hu123g45677y55i";
var reg = /\d{2,3}?/g;
console.log(str.match(reg));
在量词后面加上 ?
号 就能够取消贪婪匹配
总结
无论是 表达式还是元字符, 都只能匹配一个字符
量词:表示数量 尽可能多匹配字符 (贪婪匹配)在量词后面加上 ? 就能够取消贪婪匹配
{x}
匹配x个字符{x,y}
匹配[x,y]个字符{x,}
匹配至少x个字符x+
匹配至少一个字符x*
匹配至少0个字符x?
匹配[0,1]个字符