一、js中的正则就是用来处理字符串的。
1、验证字符是否符合规则---》匹配
2、获取字符串中符合规则的内容---》捕获
二、js中定义正则创建方式:
1、字面量创建; //var reg = /d/;
2、实例创建方式; //var reg = RegExp();
三、两种方式的区别:
1、实例创建遇到d等要多加一个
2、实例创建可以进行字符串拼接。可以把一个变量放到正则中作为规则字符串
四、正则组成:元字符和修饰符
元字符分为:特殊元字符,量词元字符,普通元字符
1、特殊元字符
d: 代表0-9之间的一个数字 === [0-9]
w: 数字、字母、下划线中的任意一个字符 === [a-zA-Z0-9_]
: 一个换行
s: 一个空白字符(空格 制表符)
: 匹配一个边界(字母和空格之间也是边界)
^: 以某一个元字符开始
$: 以某一个元字符结束
.: 除了 意外的任意一个字符
: 转义符
|: 或者
(): 分组,或者打正则中的一个小正则
[xyz]: x、y、z其中的一个
[^xyz]: 除了xyz之外的任意一个
[] 包起来的字符都是代表本身意思,没有特殊意义。例如,“.+”
2、量词元字符
*: 出现零到多次
+:一到多次
?:零或者一次
{n}: 出现n次
{n,}:n到多次
{n,m}:n到m次
3、普通元字符
所有的字符都可以作为普通元字符,普通元字符就代表自己本身意思的字符。
4、修饰符
i:ignoreCase 忽略大小写
g:global 全局匹配
m: multiline 匹配换行
五、RegExp对象方法
1、exec
捕获。返回一个数组,其中存放匹配结果。如果未找到匹配,则返回值为null。每次只能捕获一个内容,如果需要多次匹配需要添加g修饰符。然后循环捕获匹配的内容。那么有没有可以一次捕获到所有内容的呢。当然,字符串中有一个match可以做到。but它也有一些自己的弊端。后面会介绍字符串的匹配方法。
例如:返回 ["2015", index: 2, input: "你好2015,我在2016"]
数组第一项:当前正则捕获到的内容,第二项:index是捕获到内容的索引,第三性:input是捕获的那个原始字符串
正则的捕获分为两个阶段:
1)先匹配,匹配成功在进行捕获,匹配不成功返回null
2)按照进行捕获
2、test
匹配。匹配字符串中制定的值。返回true或者false。
六、正则的两个特性,既懒惰又贪婪
1、懒惰,默认执行一次exec只把第一个符合规则的捕获到,第二及以后的都不捕获
取消捕获的懒惰性用全局修饰符g来处理,例子:
var reg = /d+/g; //或者 var reg = new RegExp("\d+","g"); var str = "我们公司2015年有2500名员工,其中百分之60都是80后。"; var res = reg.exec(str); while(res){ console.log(res); res = reg.exec(str); }
2、贪婪,每一次都按照规则最长的进行捕获
取消正则的贪婪性:
1)?如果放在普通元字符后面他就是量词元字符,代表出现0-1次
2)?如果放在量词元字符后面,代表取消正则的贪婪捕获
例子:
var str = "我们公司2015年有2500名员工,其中百分之60都是80后。"; var reg = /d+?/g; console.log(reg.exec(str)); console.log(str.match(reg));
七、正则中的分组
1、分组捕获
如果一个正则中存在分组,在捕获的时候,可以把分组中的内容获取到
如果在使用分组时,只想匹配,不想捕获时,只需要在分组的最前面加 ?: 即可
例如下面的代码:
var str = "我们公司2015年有2500名员工,其中百分之60都是80后。"; var reg = /(?:d+)([u4e00-u9fa5]+,?)/g; var ary = reg.exec(str); console.log(ary);
//ary[0] 大正则捕获的内容
//ary[1] 第一个分组(不加?:的第一个分组)捕获的内容
//ary[2] 第二个分组(不加?:的第二个分组)捕获的内容
//...
//ary[n] 第n个分组(不加?:的第n个分组)捕获的内容
说到分组捕获,上面提到的字符串match方法,虽然可以一次捕获所有内容,但是不能捕获分组中内容。
var reg = /(d+)/g; var str = "我们公司2015年有2500名员工,其中百分之60都是80后。"; console.log(str.match(reg));
2、正则中的分组引用
正则中某一部分需要和另外一部分一模一样,使用分组引用处理。
例如:
var reg = /^([a-z])([a-z])21$/; console.log(reg.test("woow")); // 1 是第一个分组的引用,必须和第一个分组一模一样的内容才可以 // 2 是第二个分组的引用,必须和第二个分组一模一样的内容才可以
八、支持正则表达式的String对象的方法
1、replace 替换与正则表达式匹配的子串。返回一个新的字符串。
有两个必填函数:
1)规定字符串,或者要替换的正则对象
第一个参数如果是正则,每匹配一次replace方法就执行一次(不要忘记加g)
2)可以是字符串或生成替换文本的函数
第二个参数是function,每捕获一次函数就执行一次,不光是执行,执行的时候浏览器还默认传递了参数
var str = "welcome to jin ji lie liu xue! good good study, day day up!"; var reg = /(?:^| +)?([a-z]+)(?: +|$)?/g; str = str.replace(reg,function(){ // console.dir(arguments); //我们当前能够进行捕获的分组只有一个,传进来的参数有四个。 //第一个:大正则捕获的内容 arguments[0] == exec ary[0] //第二个:第一个分组捕获的内容 arguments[1] == exec ary[1] //第三个:打正则捕获的开始索引 arguments[2] == exec index //第四个:原始字符串 arguments[3] == exec input // var tar = arguments[1]; //每一次匹配,第一个分组捕获的内容 var tar = RegExp.$1; var f = tar.charAt(0).toUpperCase(); tar = f + tar.substr(1); return " " + tar; }); console.log(str);