1.正则表达
// 正则
// 1.检验一个字符串首尾是否有数字
// \d是数字
var reg = /^\d|\d$/g; //^开头 $结尾 |或
var str = '123abc2';
console.log(reg.test(str));
console.log(str.match(reg));
// RegExp对象方法
// test(); //检查字符串中指定的值 返回布尔
// exec(); //检索字符串中指定的值,返回找到的值。并确定其位置
// exec返回的是一个类数组
var reg1 = /ab/g;
var str1 = 'ababababbabababaababsb';
// 用exec()方法
// exec()每执行一次就会改变下一个匹配坐标 lastIndex
// 最开始lastIndex为0
console.log(reg1.exec(str1)); //lastIndex为2
console.log(reg1.exec(str1)); //lastIndex为4
console.log(reg1.lastIndex);
console.log(reg1.exec(str1)); //lastIndex为6
// 可以控制lastIndex
reg1.lastIndex = 0;
console.log(reg1.exec(str1)); //lastIndex为2
// 如何匹配出叠词 (字)\1 ()用\1代表复制出第一个()中的元素 一模一样 (b)\1\1\1代表子bbbb
// /(\w)\1\1\1/ 四个括号中匹配出来的相同的字符
// 如:要匹配出 aaaa 这样的四个相同字符格式的字符
var reg2 = /(b)\1\1\1/g; //只能匹配出bbbb
var str2 = 'bbbbccccdddd';
console.log(str2.match(reg2));
var reg3 = /(\w)\1\1\1/g; //能匹配出四个相同的字符 bbbb cccc dddd 1111 AAAA
var str3 = 'bbbbccccdddd1111AAAA';
console.log(str3.match(reg3));
var reg4 = /(\w)\1(\w)\2/g; //能匹配出aabb或者aaaa这种格式 前两位后两位分别相同 \2代表复制第二个()
var str4 = 'aabbccccdddd1111AAAA';
console.log(str4.match(reg4));
2.string的方法
// 字符串方法
// 1. match 用来匹配正则 返回一个或多个匹配到的值
var reg = /(\w)\1(\w)\2/g; //能匹配出aabb或者aaaa这种格式 前两位后两位分别相同 \2代表复制第二个()
var str = 'aabbccccdddd1111AAAA';
console.log(str.match(reg));
// 如果不带g全局匹配,那么match返回的格式与exec相同,都是类数组
var reg1 = /(\w)\1(\w)\2/; //能匹配出aabb或者aaaa这种格式 前两位后两位分别相同 \2代表复制第二个()
var str1 = '123aabbccccdddd1111AAAA';
console.log(str1.match(reg1));
// 2.search 返回匹配到的字符所在位置 没有返回-1
console.log(str1.search(reg1));
// 3.split 把字符串分隔为数组
var reg3 = /a/g;
// var reg3 = /(a)/g;//当加子表达式 分隔后的数组会有子表达式中的字符
var str3 = 'a123a456a789';
console.log(str3.split(reg3));
// 4.replace 替换字符串
// 普通替换功能
var reg4 = /a/g;//没有g 只替换第一个 有g替换所有
var str4 = 'ababababab';
console.log(str4.replace(reg4,'1'));
//如果要将aa bb交换顺序 可以用反向调用子表达式() 符号 $+第几个子表达式
var reg5 = /(\w)\1(\w)\2/g;
var str5 = 'aabbaabbaabb';
console.log(str5.replace(reg5,'$2$2$1$1'))
console.log(str5.replace(reg5,'$2$1$2$1'))
// 也可以用function来返回替换的新内容
// str.replace(reg,function(正则返回的值,第一个子表达式,第二个子表达式){})
console.log(str5.replace(reg5,function($,$1,$2){
return $2+$2+$1+$1+'asasa';
}))
// 5.toUpperCase() 字母变大写
var str6 = 'asas';
console.log(str6.toUpperCase());
// 6.toLowerCase() 字母变小写
var str7 = 'ASD';
console.log(str7.toLowerCase());
// 将the-first-name 变成the-First-Name
// 思路:用正则找到-f -n 然后替换成大写的F N
// 利用子表达式的反向调用
var reg8 = /-(\w)/g; //匹配到-x
var str8 = 'the-first-name';
// 由于自表达式的反向需要是字符串的格式'$1'。所以要用toUpperCase的话需要function内进行
console.log(str8.replace(reg8,function($,$1){
return $1.toUpperCase();
}))
// 正向预查 正向断言 ?=x
// 如:要匹配到后面紧跟着b的a
var reg9 = /a(?=b)/g;
var str9 = 'abaaaacab';
console.log(str9.match(reg9)); //匹配出两个a
var reg9 = /a(?!b)/g; //后面不是b的a
// 利用正则对字符串去重
var str10 = 'aaaaaabbbbbbbbbccccccccc';
var reg10 = /(\w)\1*/g; //\1*代表多个子表达式里的值
// 用replace替换
console.log(str10.replace(reg10,'$1'));
// 1000000000 给数字加点 按国际的格式100.000.000
var str11 = '100000000000';
var reg11 = /(?=(\d{3})+$)/g;
console.log(str11.replace(reg11,'.'));
// 由于会上面的正则只是匹配3位数一个点 所以会出现.100.000 这种情况
var reg12 = /(?=(\B)(\d{3})+$)/g;//用\B非字边界来区分 如果是不是字的边界处后面有3位数才匹配
console.log(str11.replace(reg12,'.'));