正向预查
匹配一个字符串但是 是有条件的 要求字符串后有一个特定的字符串或者没有特定字符串 就叫正向预查
var str = '1231231231';
var reg = /1(?=2)/g;
var str = '1231231231';
var reg = /1(?!2)/g;
贪婪模式和非贪婪模式
默认是贪婪模式 匹配符合要求最长的字符串
var str = 'abcd{{efg}}abcd{{xyz}}';
var reg = /{{.*}}/g;
取消贪婪模式 在后面加?
var str = 'abcd{{efg}}abcd{{xyz}}';
var reg = /{{.*?}}/g;
贪婪模式 匹配一次
var str = 'aaaaaa';
var reg = /\w?/g;
非贪婪模式 能匹配少就不匹配多
var str = 'aaaaaa';
var reg = /\w??/g;
replace
replace没有全局匹配的能力
var str = 'JSplusplus';
var str1 = str.replace('plus', '+');
var str = 'JSplusplus';
var reg = /plus/;
var str1 = str.replace(reg, '+');
var str = 'JSplusplus';
var reg = /plus/g;
var str1 = str.replace(reg, '+');
xxyy -> yyxx
用$去拿子表达式中的引用的字符串
var str = 'aabbccdd';
var reg = /(\w)\1(\w)\2/g;
var str1 = str.replace(reg, '$2$2$1$1');
$ 当次被匹配的字符转 $1 第一个子表达式 $2第二个子表达式
var str = 'aabbccdd';
var reg = /(\w)\1(\w)\2/g;
var str1 = str.replace(reg, function ($, $1, $2) {
console.log($, $1, $2);
});
所以也可以这样写
var str = 'aabbccdd';
var reg = /(\w)\1(\w)\2/g;
var str1 = str.replace(reg, function ($, $1, $2) {
return $2 + $2 + $1 + $1;
});
js-plus-plus -> jsPlusPlus
先看一下错误的写法
此时没有小括号 没有子表达式 所以$1就只是匹配的下标
var str = 'js-plus-plus';
var reg = /-\w/g;
var str1 = str.replace(reg, function ($, $1) {
console.log($, $1);
return $1.toUpperCase();
});
正确的写法
var str = 'js-plus-plus';
var reg = /-(\w)/g;
var str1 = str.replace(reg, function ($, $1) {
console.log($, $1);
return $1.toUpperCase();
});
jsPlusPlus -> js_plus_plus
var str = 'jsPlusPlus';
var reg = /([A-Z])/g;
var str1 = str.replace(reg, function ($, $1) {
return '_' + $1.toLowerCase();
});
xxyyzz -> XxYyZz
var str = 'xxyyzz';
var reg = /(\w)\1(\w)\2(\w)\3/g;
var str1 = str.replace(reg, function ($, $1, $2, $3) {
return $1.toUpperCase() + $1 + $2.toUpperCase() + $2 + $3.toUpperCase() + $3;
});
aabbcc -> a
b
b
bc$ 不适用function
先看一下这种情况 除了$ 都可以直接加
var str = 'aabbcc';
var reg = /(\w)\1(\w)\2(\w)\3/g;
var str1 = str.replace(reg, '$1*$2*$3');
对于
说需要写两个
说需要写两个
说需要写两个
或则和$ 转义也可以
var str = 'aabbcc';
var reg = /(\w)\1(\w)\2(\w)\3/g;
var str1 = str.replace(reg, '$1$$$2$$$3$$');
匹配\ ? + * 都需要转义
语法中存在的符号都需要转义
var str = 'aa?bb?cc';
var reg = /\?/g;
aabbcc -> abc
var str = 'aabbcc';
var reg = /(\w)\1(\w)\2(\w)\3/g;
var str1 = str.replace(reg, '$1$2$3');
但是这种方法对于aaaaaabbbcccccccc是无法去重的
需要这样做
var str = 'aaaaaaaaaabbbbbbbbbcccccc';
var reg = /(\w)\1*/g;
var str1 = str.replace(reg, '$1');
1000000000 -> 100,00,000
空后面紧跟着非单词边界的三个数字为一组 至少有一组
如果匹配到就在前面加一个逗号
var str = '10000000000';
var reg = /(?=(\B)(\d{3})+$)/g;
var str1 = str.replace(reg, ',');
双大括号替换值
var str = "My name is {{name}}. I'm {{age}} years old";
var reg = /{{(.*?)}}/g;
var str1 = str.replace(reg, function (node, key) {
console.log(node, key);
return {
name: 'Jone',
age: 32,
}[key];
});
非捕获分组与一些常用正则案例
至少6位 包含一个大写 一个小写 一个数字 一个特殊
使用正向预查
reg = /^.*(?=.{6,})(?=.*\d)(?=.*[A-Z])(?=.*[a-z])(?=.*[~!?@#$%^&*].*$)/
匹配邮箱
var reg = /^([A-z0-9_-])+\@([A-z0-9_\-\.]+\.([A-z]{2,4}))$/;
捕获分组
var str = 'abcabc';
var reg = /(a)(b)(c)/;
console.log(str.match(reg));
不捕获分组 ?:
var str = 'abcabc';
var reg = /(?:a)(b)(c)/;
console.log(str.match(reg));
手机号校验
var reg = /^(\(\+86\))?(13[0-9]|14[57]|15[012356789]|17[0678]|18[0-9])\d{8}$/;
日期校验
1990-12-01 1991/12/01 1991.12.01
var reg = /^(19|20)\d\d([-/.])(0[1-9]|1[0-2])\2(0[1-9]|[12][0-9]|3[01])/;
十六进制的颜色
var reg = /^#([A-Fa-f0-9]){6}|([A-Fa-f0-9]){3}/;
qq号
var reg = /^[1-9][0-9]{4,9}/;
微信号
var reg = /^[A-z]([A-z0-9_-]{5,19})+$/;