exec()和match()區別
當採用非全局匹配的時候,兩個方法的返回值徹底同樣。
match和exec都只匹配一次,且都會把分組抽出來放到數組後面
(function(){
let str="antzoane";
let reg=/(a)(n)/;
console.log(str.match(reg));
console.log(reg.exec(str));
})();

當爲全局匹配的時候,match方法返回一個存放全部匹配內容的數組(無視子表達式的匹配)。
exex方法返回數組不會存儲全部的匹配,僅存儲第一個匹配到的內容(存儲在數字第一個元素),第二個元素存儲第一個子表達式匹配到的內容,第三個元素存儲第二個子表達式匹配到的內容,以此類推
(function(){
let str="antzoane";
let reg=/a(n)/g;
console.log(str.match(reg));
console.log(reg.exec(str));
//再次調用從上次的lastindex開始匹配;
console.log(reg.exec(str));
})();

match()和分組匹配
var reg = /(\d{4})-(\d{2})-(\d{2})/;
var dateStr = '2018-04-18';
var s=dateStr.match(reg);
console.log(s)//arr[0]是匹配的結果,arr[1]是第一個()裏的匹配內容,全局匹配不會返回()裏的內容
var str="hello my name is ben ,this is ";
var reg2=/ {1,}/g;
var reg22=/( ){1,}/g//()內當作一個總體去匹配
console.log(str.match(reg2));
console.log(str.match(reg22));

replace()和分組捕獲
所有匹配添加修飾
var str="0816-2323263";
var reg=/(\d+)(-)(\d+)/g;
var str2=str.replace(reg,"($1)-$3");//所有匹配添加修飾
console.log(str2);//(0816)-2323263
(?<name>)與(?:exp)
var str1="123478basd-12aaaaa";
var reg1=/(\d+)([a-z]+)(\d+)(?<rename>[a-z]+)/g;
var str21=str1.replace(reg1,"$1hhhhh$<rename>");//(?<name>)捕獲文本到名稱爲name的組裏 (?:exp)匹配exp,不捕獲匹配的文本,也不給此分組分配組號
console.log(str21);//123478basd-12aaaaa
匹配須要刪除的部分而後置空
var str23="123478basd12asdsa";
var reg2=/[a-z]+/g;
var str22=str23.replace(reg2,"");//匹配須要刪除的部分而後置空
console.log(str22);//12347812
貪婪與懶惰
var str="abc8defghij7klngon8qrstwxy7";
var reg1=/8[a-zA-Z0-9]*7/;
var reg2=/8[a-zA-Z0-9]*?7/;
var reg3=/8[a-zA-Z0-9]+?/;
var res1=str.match(reg1);
var res2=str.match(reg2);
var res3=str.match(reg3);
console.log(res1);
console.log(res2);
console.log(res3);

零寬斷言
- (?=exp)向前查找
- (?<=exp)向後查找
- (?!exp)匹配後面跟的不是exp的位置
- (?<!exp)匹配前面不是exp的位置
(function(){
var str="http://www.sina.com.cn ";
var reg1= new RegExp(/.+(:)/g);
var res1=str.match(reg1);
var reg2=new RegExp(/.+(?=:)/);
var res2=str.match(reg2);
console.log(res1);
console.log(res2);
})();

(function(){
var a = "價格是123456789.6754";
var reg4= new RegExp(/(\d)(?=(\d{3})+\.)/g);
console.log(a.match(reg4));
var b = a.replace(reg4, '$1,');
console.log(b)
})();

(function(){
let str="ABCD01:$23.45";
let reg1=/\$[0-9.]+/g;
let reg2=/(?<=\$)[0-9.]+/g;
let res1=str.match(reg1);
let res2=str.match(reg2);
console.log(res1);
console.log(res2);
})();

匹配固定位數
- 匹配固定位數時,不能/[1-9]d{4,11}/這樣寫,這樣輸入15位也會從15位中成功匹配11位
- 只能用^和$匹配字符串開始和結束位置,而後再匹配中間的位數(^$不是從哪裏開始匹配
function check(val) {
console.log(val)
var reg = /^[1-9]\d{4,8}[0-9]$/;//匹配5到10位qq號
if (!reg.test(val)) {
alert("輸入有誤");
}else{
alert("輸入正確");
}
}