//定義正則表達式的兩種方式,在用構(gòu)造函數(shù)的時候,有些地方是要加轉(zhuǎn)義字符的。
//1嗦枢、字面量攀芯。
var reg = /\bis\b/ig;
var str = "He is a good boy";
console.log(str.replace(reg, 'IS')); //He IS a good boy
//2屯断、構(gòu)造函數(shù)
var reg = new RegExp('\\bis\\b', 'ig'); //加了轉(zhuǎn)義字符
var str = "He is a good boy";
console.log(str.replace(reg, 'IS')); //He IS a good boy
//正則表達式由兩種基本字符類型組成:
//1.原義文本字符:代表其本身
//2.元字符:在正則表達式中有特殊含義的非字母字符
//字符類取反:^,注意:^符號只有在[]中才是取反的意思,在[]外面表示開頭
//例如
//var reg = /[^\d]/ig;
//var str = '123456dsa';
//str.replace(reg,'m');//123456mmm
//test()方法用于測試字符串是否符合正則表達式侣诺,默認(rèn)只要字符串中有一部分符合殖演,就返回true,不符合返回false年鸳。
//加上^和$表示str必須從頭到尾完全匹配規(guī)則趴久,否則就是false.^表示以xxx開始,$表示以XXX結(jié)束
//\b表示單詞邊界 \B表示非單詞邊界
// var reg = /abc/ig;
// var str = "abcd";
// reg.test(str);//true
//
//var reg = /^abc$/ig;
//var str = "abcd";
//reg.test(str);//false
//1. 備選字符集:規(guī)定某*一位*字符可選的備選文字列表
// 語法:[備選字符列表]
// 強調(diào):無論備選字符集中由有多少字符搔确,都必須且只能選1個,一個[]只代表1位字符彼棍!
// 比如:6位數(shù)字:[0123456789][0123456789][0123456789][0123456789][0123456789][0123456789]
//2. -:如果備選字符連續(xù),可用-表示"到"
//3. 預(yù)定義字符集:專門表示常用的連續(xù)的字符集
// \d ==>[0-9] : 1位數(shù)字
// \w ==>[0-9a-zA-Z_] : 1位數(shù)字膳算,字母或下劃線
// \s ==>[空字符] : 代表一位空字符:空格座硕,Tab符
//
var reg = /[abcdefg]/;
var str = "a";
console.log(reg.test(str)); //true
var reg = /[abcdefg]/;
var str = "abl";
console.log(reg.test(str)); //true,因為只匹配一個字符涕蜂,符合华匾,就返回true,不管后面是怎么樣的內(nèi)容机隙。
var reg = /[abcdefg]/;
var str = "lab";
console.log(reg.test(str)); //true蜘拉,同上
var reg = /^[abcdefg]$/g;
var str = "ab";
console.log(reg.test(str)); //false萨西,規(guī)則是只匹配一個字符,字符串中是兩個字符旭旭,所以false
var reg = /^[abcdefg]+$/g;
var str = "ab";
console.log(reg.test(str)); //true谎脯,規(guī)則中的含義是,匹配一個或多個小寫字母組成的字符串
// .:除了換行外持寄,其他所有的字符
//
// \D,\W,\S-->除了\d,\w或\s --了解
//4. 量詞:規(guī)定一個字符集出現(xiàn)的次數(shù):2種
// (1)明確數(shù)量:3種:{min,max}:最少min位穿肄,最多max位
// {min,}:至少min位
// {n}:必須n位
// 身份證號:15位或者18位
// 18位時后三位: 2位數(shù)字+最后一位數(shù)字或x X,后三位可有可無,但最多出現(xiàn)1次
// \d{15}(\d{2}[0-9xX])?
//
// (2)不確定數(shù)量:3種:
// ? ==>{0,1}: 可有可無际看,最多1次
// * ==>{0,}:可有可無咸产,多了數(shù)量不限
// + ==>{1,}:至少一次,多了數(shù)量不限
//g的作用仲闽,不加g的時候脑溢,雖然有兩個 is,但找到一個以后就停止匹配了赖欣,g是global的縮寫
//var reg = /is/;
//console.log(reg.global);//false
//var reg = /is/g;
//console.log(reg.global);//true
//最簡單的正則表達式
var str = "He is a good boy";
var reg = /is/;
console.log(str.replace(reg, 'IS')); //ThIS is a good boy
//這樣就會匹配出當(dāng)前字符串中所有的is
var reg1 = /is/g;
console.log(str.replace(reg1, 'IS')); //ThIS IS a good boy
//只匹配到小寫的is屑彻,i是ignoreCase的縮寫,加上i表示匹配是忽略大小寫
//var reg = /is/i;
//console.log(reg.ignoreCase);//true
var reg2 = /is/g;
var str = "This IS a good boy";
console.log(str.replace(reg2, 'o')); //Tho IS a good boy
var reg3 = /is/gi;
var str = "This IS a good boy";
console.log(str.replace(reg3, 'o')); //Tho o a good boy
//貪婪模式
var reg4 = /\d{3,6}/ig;
var str = "12345678";
console.log(str.replace(reg4, 'X')); //X78
//讓正則表達式盡可能少的匹配顶吮,也就是說一旦成功匹配不再繼續(xù)嘗試社牲,就是非貪婪模式,在量詞后面加上?即可
var reg5 = /\d{3,6}?/ig;
var str = "12345678";
console.log(str.replace(reg5, 'X')); //XX78
//前瞻:在正則表達式匹配到規(guī)則的時候悴了,向前檢查是否符合斷言茵肃,后顧/后瞻 方向相反
//正則表達式從文本頭部向尾部開始解析,文本尾部方向稱為"前"评抚,通俗的說谦秧,從頭開始,向尾部搜索搞莺,比喻成走路息罗,尾部就是前方了。
//要找的值滿足查詢附帶的條件才沧,例如迈喉,我要找你的哥哥。目標(biāo)是哥哥温圆,條件是你的哥哥挨摸。左面的5是哥哥,右邊的5是你
var str = "4d4d4d55";
var reg = /\d(?=\d)/ig; //
str.replace(reg, 'w'); //"4d4d4dw5"
//負(fù)向前瞻
var str = "4a4b4c55";
var reg = /\d(?!\d)/ig;
str.replace(reg, 'w'); //"wawbwc5w"
//用()括起來代表分組捌木,從左到右序號遞增油坝,對應(yīng)的變量的值$1,$2,.....$n,注意:只有在字符串滿足完整的正則表達式的前提下,才會匹配出子項澈圈。通俗的說彬檀,就是有了爸爸才能有兒子。
//反向引用
//match獲取當(dāng)前字符串中查詢到的所有符合正則的內(nèi)容瞬女,存放到一個數(shù)組中窍帝。
//exec 方法受參數(shù) g的影響。若指定了 g诽偷,則下次調(diào)用 exec 時坤学,會從上個匹配的 lastIndex 開始查找。lastIndex是當(dāng)前表達式匹配內(nèi)容的最后一個字符的下一個位置报慕。 exec每次只查詢字符串中一個符合正則表達式的內(nèi)容深浮,并返回其值和當(dāng)前值中的子項,存放在一個數(shù)組中眠冈。不指定g的時候飞苇,索引值不變,不管調(diào)用幾次蜗顽,查找的都是字符串中第一個符合正則的值布卡。
var str = "ma name is aa Aa aaa aa";
var reg = /aa/ig;
str.match(reg); //["aa", "Aa", "aa", "aa"]
reg.exec(str); //["aa"]
reg.exec(str); //["Aa"]
reg.exec(str); //["aa"]
reg.exec(str); //["aa"]
reg.exec(str); //null
reg.exec(str); //["aa"]
//test()方法exp.test(str);返回值為true和false,符合返回true雇盖,下次調(diào)用 test 時會從上個匹配的 lastIndex 開始查找忿等。
var str = "abcd";
var reg = /\w/ig;
reg.test(str); //true,第一個匹配的是a
reg.test(str); //true,第一個匹配的是b
reg.test(str); //true,第一個匹配的是c
reg.test(str); //true,第一個匹配的是d
reg.test(str); //false,未匹配到值
reg.test(str); //true,重新開始匹配a
//加了^$,所以當(dāng)前規(guī)則要求字符串完全符合正則表達式崔挖,恰好當(dāng)前字符串是符合的贸街,于是可以匹配出子項
var str = '2015-08-23';
var reg = /^(\d{4})-(\d{2})-(\d{2})$/ig;
str.replace(reg, '$1/$2/$3'); //2015/08/23
//再看這個,也 加了^$虚汛,要求字符串從頭到尾完全符合正則表達式匾浪,當(dāng)前字符串不符合皇帮,所以匹配不到任何值卷哩,也就沒有子項。沒有爸爸属拾,也就沒有兒子了将谊。
var str = 'a2015-08-23a';
var reg = /^(\d{4})-(\d{2})-(\d{2})$/ig;
reg.test(str); //false,也就會沒有匹配到任何值
str.replace(reg, '$1/$2/$3'); //"a2015-08-23a"
//去掉了^$,也就不需要字符串從頭到尾完全符合正則表達式渐白,于是就匹配到了值
var str = 'a2015-08-23a';
var reg = /(\d{4})-(\d{2})-(\d{2})/ig;
str.replace(reg, '$1/$2/$3'); //"a2015/08/23a"
//那么尊浓,我們需要證明一下它的子項有哪些,于是調(diào)用了exec函數(shù)纯衍,這個函數(shù)的作用是將匹配到的值和其中的子項放在一個數(shù)組里栋齿。
var str = 'a2015-08-23a';
var str = 'a2015-08-23a'; //["2015-08-23", "2015", "08", "23", index: 1, input: "a2015-08-23a"],這是匹配到的字符串和其子項
//于是,我們知道瓦堵,他的子項$1,$2,$3分別是exec[1],exec[2],exec[3]
str.replace(reg, '$1/$2/$3'); //"a2015/08/23a"
//用子項替換當(dāng)前字符串中匹配到的值(2015-08-23),也就是"a2015-08-23a"中基协,將"2015-08-23"替換為2015、08菇用、23澜驮,結(jié)果為
//"a2015/08/23a"
//如果不希望捕獲分組,那么惋鸥,可以再分組內(nèi)加上?:杂穷,像這樣(?:\d{4}),這樣,這個分組就不會被捕獲了卦绣。
var str = 'a2015-08-23a';
var reg = /(?:\d{4})-(\d{2})-(\d{2})/ig;
var match = str.match(reg);
console.log(match); //"2015-08-23"耐量,這樣,我們就得到了當(dāng)前匹配到的字符串滤港。
var exec = reg.exec(str);
console.log(exec); //["2015-08-23", "08", "23"]拴鸵,匹配到的字符串和其子項中,沒有匹配到"2015"這一子項
//他的子項$1,$2分別是exec[1],exec[2]蜗搔,也就是"08"和"23"
str.replace(reg, '$1/$2'); //"a08/23a"
//這時劲藐,如果這樣寫:
//str.replace(reg,'$1/$2$3');
//匹配到的是"a08/23$3a",因為$3并沒有值。
rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/
var str = ‘<html></html>’;
\1就是第一個子項的意思
// .代表所有字符