正則表達(dá)式:使用單個(gè)字符串來(lái)描述、匹配一系列·符合·某個(gè)句法規(guī)則的字符串搜索模式。
語(yǔ)法:/正則表達(dá)式主體/修飾符
修飾符:i表示執(zhí)行對(duì)大小寫(xiě)不敏感的匹配管引。g表示執(zhí)行全局匹配(查找所有匹配而非在找到第一個(gè)匹配后停止)梆靖。m表示執(zhí)行多行匹配。
字符串方法(search()在抛、replace()钟病、match()、split())
1.search()方法刚梭,用于檢索指定字符串的子字符串肠阱,并返回子字符串的起始位置。
????語(yǔ)法:str.search(regexp);
????例如:使用正則表達(dá)式搜索 "Runoob" 字符串朴读,且不區(qū)分大小寫(xiě):
var str = "Visit Runoob!";
var n = str.search(/Runoob/i);//使用正則表達(dá)式
//結(jié)果輸出為6
var str = "Visit Runoob!";
var n = str.search(("Runoob");//使用字符串作為參數(shù)
//結(jié)果輸出為6
2.replace()方法屹徘,用在字符串中的一些字符替換另一些字符,或替換與正則表達(dá)式匹配的字符串衅金。
????語(yǔ)法:str.replace(regexp);
????例如:使用正則表達(dá)式且不區(qū)分大小寫(xiě)將字符串中的 Microsoft 替換為 Runoob :
var str = document.getElementById("demo").innerHTML;
var txt = str.replace(/microsoft/i,"Runoob");//使用正則表達(dá)式
//結(jié)果輸出為Visit Runoob!
var str = document.getElementById("demo").innerHTML;
var txt = str.replace("Microsoft","Runoob");//使用字符串作為參數(shù)
//結(jié)果輸出為Visit Runoob!
3.match()方法噪伊,可在字符串內(nèi)檢索指定的值,或找到一個(gè)或多個(gè)正則表達(dá)式的匹配氮唯,并以數(shù)組形式返回匹配結(jié)果酥宴。
????語(yǔ)法:str.match(regexp);
????例如:使用正則表達(dá)式且不區(qū)分大小寫(xiě)將全文字符串中的here查找出來(lái) :
var str = 'Where there is a will,there is a way!'
console.log(str.match(/here/gi));
//打印結(jié)果為:here,here,here
4.split()方法,用于把一個(gè)字符串分割成字符串?dāng)?shù)組您觉。
????語(yǔ)法:str.split(separator,limit);??separator為字符串或正則表達(dá)式拙寡,limit指定返回?cái)?shù)組的最大長(zhǎng)度。
????例如:
var str = 'How are you doing today?'
console.log(str.split());//打印結(jié)果為How are you doing today?
console.log(str.split(''));//打印結(jié)果為H,o,w, ,a,r,e, ,y,o,u, ,d,o,i,n,g, ,t,o,d,a,y,?
console.log(str.split(' ',3));//打印結(jié)果為How are you
console.log(str.split('o'));//打印結(jié)果為H,w are y,u d,ing t,day?
RegExp對(duì)象方法(test()琳水、exec()肆糕、compile())
RegExp對(duì)象是一個(gè)預(yù)定義了屬性和方法的正則表達(dá)式對(duì)象般堆。
語(yǔ)法:var patt = new RegExp(pattern,modifiers); 或 var patt = /pattern/modifiers;
??????pttern為表達(dá)式,modifiers為修飾符用于指定全局匹配g诚啃,區(qū)分大小寫(xiě)i淮摔,和多行比配m。
1.test()方法始赎,用于檢測(cè)字符是否匹配某個(gè)模式和橙,有則返回true,否則返回false造垛。
????語(yǔ)法:patt.test(str)
????例如:搜索字符串中的字符 "e":
var patt = /e/;
patt.test("The best things in life are free!");
//輸出結(jié)果為true
2.exec()方法魔招,用于檢索字符串中是否有正則表達(dá)式的匹配值,有則返回匹配值五辽,否則返回null办斑。
????語(yǔ)法:patt.exec(str)
????例如:
var str = 'cat and dog';
var patt = /cat/g;
console.log(patt.exec(str));
//輸出結(jié)果為cat
var patt1 = /life/g;
console.log(patt1.exec(str));
//輸出結(jié)果為null
3.compile()方法,用于在腳本執(zhí)行過(guò)程中編譯正則表達(dá)式杆逗,也可用于改變和重新編譯正則表達(dá)式乡翅。
????語(yǔ)法:patt.compile(regexp,modifier)
????例如:
var str = 'cat and dog';
var patt = /cat/g;
console.log(str.replace(patt,'sheep'));//打印結(jié)果為sheep and dog
patt = /dog/g;或patt = new RegExp('dog','g');
patt.compile('dog','g');
console.log(str.replace(patt,'pig'));//打印結(jié)果為sheep and pig
擴(kuò)充常見(jiàn)正則表達(dá)式中的元字符及其含義:
字符 | 描述 |
---|---|
\ | 將下一個(gè)字符標(biāo)記為一個(gè)特殊字符、或一個(gè)原義字符罪郊、或一個(gè) 向后引用蠕蚜、或一個(gè)八進(jìn)制轉(zhuǎn)義符。例如悔橄,'n' 匹配字符 "n"靶累。'\n' 匹配一個(gè)換行符。序列 '\' 匹配 "" 而 "(" 則匹配 "("橄维。 |
^ | 匹配輸入字符串的開(kāi)始位置尺铣。通常用來(lái)限定字符串 |
$ | 匹配輸入字符串的結(jié)束位置拴曲。通常用來(lái)限定字符串 |
* | 匹配前面的子表達(dá)式零次或多次争舞。例如,zo* 能匹配 "z" 以及 "zoo"澈灼。* 等價(jià)于{0,}竞川。 |
+ | 匹配前面的子表達(dá)式一次或多次。例如叁熔,'zo+' 能匹配 "zo" 以及 "zoo"委乌,但不能匹配 "z"。+ 等價(jià)于 {1,}荣回。 |
? | 匹配前面的子表達(dá)式零次或一次遭贸。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 心软。? 等價(jià)于 {0,1}壕吹。 |
{n} | n 是一個(gè)非負(fù)整數(shù)著蛙。匹配確定的 n 次。例如耳贬,'o{2}' 不能匹配 "Bob" 中的 'o'踏堡,但是能匹配 "food" 中的兩個(gè) o。 |
{n,m} | m 和 n 均為非負(fù)整數(shù)咒劲,其中n <= m顷蟆。最少匹配 n 次且最多匹配 m 次。例如腐魂,"o{1,3}" 將匹配 "fooooood" 中的前三個(gè) o帐偎。'o{0,1}' 等價(jià)于 'o?'。請(qǐng)注意在逗號(hào)和兩個(gè)數(shù)之間不能有空格挤渔。 |
[xyz] | 字符集合肮街。匹配所包含的任意一個(gè)字符。例如判导,“[abc]”可以匹配“plain”中的“a”嫉父。 |
[^xyz] | 負(fù)值字符集合。匹配未包含的任意字符眼刃。例如绕辖,“[^abc]”可以匹配“plain”中的“plin”任一字符。 |
[a-z] | 字符范圍擂红。匹配指定范圍內(nèi)的任意字符仪际。例如,'[a-z]' 可以匹配 'a' 到 'z' 范圍內(nèi)的任意小寫(xiě)字母字符昵骤。 |
[^a-z] | 負(fù)值字符范圍树碱。匹配任何不在指定范圍內(nèi)的任意字符。例如变秦,'[^a-z]' 可以匹配任何不在 'a' 到 'z' 范圍內(nèi)的任意字符成榜。 |
\b | 匹配一個(gè)單詞的邊界,也就是指單詞和空格間的位置蹦玫。例如赎婚,“er\b”可以匹配“never”中的“er”,但不能匹配“verb”中的“er”樱溉;“\b1_”可以匹配“1_23”中的“1_”挣输,但不能匹配“21_3”中的“1_”。 |
\B | 匹配非單詞邊界福贞×媒溃“er\B”能匹配“verb”中的“er”,但不能匹配“never”中的“er”。 |
\d | 匹配一個(gè)數(shù)字字符完丽。等價(jià)于 [0-9]向瓷。 |
\D | 匹配一個(gè)非數(shù)字字符。等價(jià)于 [^0-9]舰涌。 |
\n | 匹配一個(gè)換行符猖任。等價(jià)于\x0a和\cJ。 |
\s | 匹配任何不可見(jiàn)字符瓷耙,包括空格朱躺、制表符、換頁(yè)符等等搁痛。等價(jià)于[ \f\n\r\t\v]长搀。 |
\S | 匹配任何可見(jiàn)字符。等價(jià)于[^ \f\n\r\t\v]鸡典。 |
\num | 匹配num源请,其中num是一個(gè)正整數(shù)。 |
例題
1.給定字符串 str彻况,檢查其是否符合如下格式:XXX-XXX-XXXX谁尸,其中 X 為 Number 類型。
??解析:開(kāi)頭^和結(jié)尾$必須加上來(lái)限定字符串纽甘,3個(gè)數(shù)可表示為\d{3}良蛮,4個(gè)數(shù)則為\d{4},{n}表示前面內(nèi)容出現(xiàn)的次數(shù)悍赢。
function matchesPattern(str) {
return /^\d{3}-\d{3}-\d{4}$/.test(str);
}
function matchesPattern(str) {
return /^\d{3}-{2}-\d{4}$/.test(str);
}
2.給定字符串 str决瞳,檢查其是否包含 連續(xù)3個(gè)數(shù)字 ,如果包含左权,返回最新出現(xiàn)的 3 個(gè)數(shù)字的字符串皮胡,如果不包含,返回 false赏迟。
??解析:match()返回的是正則表達(dá)式匹配的字符串?dāng)?shù)組屡贺,連續(xù)的三個(gè)任意數(shù)字用正則表達(dá)式表示為/\d{3}/。
function captureThreeNumbers(str) {
var dataArr = str.match(/[0-9][0-9][0-9]/);
if(dataArr)
return dataArr[0];
else return false;
}
function captureThreeNumbers(str) {
//聲明一個(gè)數(shù)組保存匹配的字符串結(jié)果
var arr = str.match(/\d{3}/);
//如果arr存在目標(biāo)結(jié)果瀑梗,則返回第一個(gè)元素烹笔,即最早出現(xiàn)的目標(biāo)結(jié)果
if(arr)
return arr[0];
else return false;
}
3.給定字符串 str裳扯,檢查其是否符合美元書(shū)寫(xiě)格式:以 $ 開(kāi)始;整數(shù)部分抛丽,從個(gè)位起,滿 3 個(gè)數(shù)字用 , 分隔;如果為小數(shù)饰豺,則小數(shù)部分長(zhǎng)度為2;正確的格式如:$1,023,032.03 或者 $2.03,錯(cuò)誤的格式如:$3,432,12.12 或者 $34,344.3亿鲜。
??解析:開(kāi)頭必是表示結(jié)尾,需要進(jìn)行轉(zhuǎn)義蒿柳,因此開(kāi)頭為^$;
????????然后dollar符后必然接數(shù)字饶套,并且最少一位,最多三位數(shù)垒探,可用{m,n}表示,最少m位妓蛮,最多n位,因此此段為\d{1,3};
????????接著圾叼,后面如還有數(shù)蛤克,則必然有,分隔夷蚊,并且后面必有3個(gè)數(shù)构挤,類似于,XXX的格式會(huì)出現(xiàn)0或者n次惕鼓,因此此段可表示為(,\d{3})*;
????????最后筋现,如有小數(shù)部分,則注意對(duì)小數(shù)點(diǎn)進(jìn)行轉(zhuǎn)義箱歧,此段可表示為(.\d{2})?;
????????使用test方法去檢測(cè)str
function isUSD(str) {
return /^\$\d{1,3}(,\d{3})*(\.\d{2})?$/.test(str);
}