匹配(test):
特殊意义的元字符:
reg.test():匹配 reg.exec():捕获
^:以...作为开头
$:以...作为结尾
- :匹配任意字符
\: 表示转义,有特殊意义转为普通意义 ,
\d:匹配任意一个非\n数字(只能是一个数字)
\w:匹配数字字母下划线
\b:匹配边界(注意:开头 结尾 空格 换行 都是边界)
\n:匹配换行
\s:匹配一个空白符(通常都是空格和换行)
量词元字符:
*:出现0次或者多次
+:出现1次或者多次
?:出现0次或者1次
{n}:出现n次
{n,}:至少出现n次
{n,m}:出现次数在n到m次
例:匹配手机号:/^1\d{10}$/ 匹配零点几的小数:/^0\.+$/
特别的:[ ]:有特殊意义的元字符进入到[ ]中就变成了本身的意义
如: /[xyz]/:表示匹配x y z中的任意一个
/x|y/:x或者y中的任意一个
/[a-z]/:a-z中任意一个 (注意 - 的左右问题,要按顺序!)
/[^xyz]/:除了xyz中任意一个字符( ^ 与 [ ] 搭配表示 除了)
捕获(exec):
正则表达式捕获的懒惰性:在找到一个匹配的内容时,就停止了捕获查找
解决懒惰性的方法:给正则表达式加一个全局修饰符g。虽然解决了懒惰性,但是exec一次只能捕获一次,所以只能一次一次的进行捕获,直到结果为null,就全部捕获到想要的内容。
var reg=/a\d/g;
var str="aaaaa1ba25555a3";
// console.log(reg.exec(str));
// console.log(reg.exec(str));
// console.log(reg.exec(str));
// console.log(reg.exec(str));
我们可以自己写一个while循环把捕获到的内容都放到一个数组中:
var ary=[];
var val=reg.exec(str);
while (val){
ary.push(val[0]);
val=reg.exec(str);
}
console.log(ary);
在字符串中提供了match方法,可以一次性捕获到所有符合条件的内容:
var reg=/\d{2}/g;
var str="js12css34HTML56";
console.log(str.match(reg)); //["12", "34", "56"]
分组捕获:
如果想单独捕获到内容,可以使用小括号将需要捕获到的内容括起来,不过不想捕获到某部分内容,可以在小括号中最前面加入?:即可 (?: )
var str = "html:1000+css:1000+js:10000+vue:1000+react:1000+node:1000";
var reg = /(?:^|\+)([a-z]{2,5}:(\d+))/g;
console.log(reg.exec(str));
console.log(reg.exec(str));
console.log(reg.exec(str));
console.log(reg.exec(str));
console.log(reg.exec(str));
console.log(reg.exec(str));
注意:正则加上g,使用match方法不会捕获到分组内容
正则捕获的贪婪性:当出现量词元字符时,按照最大长度来捕获内容,要想解决贪婪性,在量词元字符后面加一个?即可
//贪婪性
var reg = /\d+/g;
console.log(reg.exec("123asdfgh45d4567d"));//123
console.log(reg.exec("123asdfgh45d4567d"));//45
console.log(reg.exec("123asdfgh45d4567d"));//4567
var reg = /\d+?/g;
console.log(reg.exec("123asdfgh45d4567d")); //1
console.log(reg.exec("123asdfgh45d4567d")); //2
console.log(reg.exec("123asdfgh45d4567d")); //3