正則表達(dá)式功能:
測試字符串的某個模式卢佣。例如對一個輸入字符串進(jìn)行測試,看在該字符串是否存在一個電話號碼模式或一個信用卡號碼模式。這稱為數(shù)據(jù)有效性驗證
替換文本留荔。可以在文檔中使用一個正則表達(dá)式來標(biāo)識特定文字澜倦,然后全部刪除聚蝶,替換為其他文字
根據(jù)模式匹配從字符串中提取一個字符串≡逯危可以用來在文本或輸入字段中查找特定文字碘勉。
創(chuàng)建正則表達(dá)式
var re = new RegExp();//RegExp是一個對象,和Aarray一樣
//但這樣沒有任何效果,需要將正則表達(dá)式的內(nèi)容作為字符串傳遞進(jìn)去
re =new RegExp("a");//最簡單的正則表達(dá)式,將匹配字母a
re=new RegExp("a","i");//第二個參數(shù),表示匹配時不分大小寫
RegExp構(gòu)造函數(shù)第一個參數(shù)為正則表達(dá)式的文本內(nèi)容,而第一個參數(shù)則為可選項標(biāo)志桩卵,標(biāo)志可以組合使用
g全文查找
i忽略大小寫
m多行查找
var re = new RegExp("a","gi");//匹配所有的a或A
正則表達(dá)式還有另一種正則表達(dá)式字面量的聲明方式
var re=/a/gi;
和正則表達(dá)式相關(guān)的方法和屬性
正則表達(dá)式對象的方法
- test验靡,返回一個Boolean值,它指出在被查找的字符串中是否存在模式雏节。如果存在則返回true,否則返回false胜嗓。
- exec,用正則表達(dá)式模式在字符串中運(yùn)行查找,并返回包<script type="text/javascript" src="http://www.iteye.com/javascripts/tinymce/themes/advanced/langs/zh.js"></script><script type="text/javascript" src="http://www.iteye.com/javascripts/tinymce/plugins/javaeye/langs/zh.js"></script>含該查找結(jié)果的一個數(shù)組钩乍。
- complie,把正則表達(dá)式編譯為內(nèi)部格式辞州,從而執(zhí)行得更快。正則表達(dá)式對象的屬性寥粹。
- source变过,返回正則表達(dá)式模式的文本的副本埃元,只讀。
- lastIndex牵啦,返回字符位置亚情,它是被查找字符串中下一次成功匹配的開始位置。
- l...9,返回九個在模式匹配期間找到的哈雏、最近保存的部分楞件。只讀
- input($_),返回執(zhí)行規(guī)范表述查找的字符串。只讀裳瘪。
- lastMatch($&),返回任何正則表達(dá)式搜索過程中的最后匹配的字符土浸。只讀。
- lastParen($+)如果有的話彭羹,返回任何正則表達(dá)式查找過程中最后括的子匹配黄伊。只讀。
- leftContext($`),返回被查找的字符串中從字符串開始位置到最后匹配之前的額位置之間的字符派殷。只讀还最。
- rightContext($`),返回被搜索的字符串中從最后一個匹配位置開始到字符串結(jié)尾之間的字符。只讀毡惜。
String對象一些和正則表達(dá)式相關(guān)的方法 - match,找到一個或多個正則表達(dá)式的匹配拓轻。
- replace,替換與正則表達(dá)式匹配的字符串
- search,檢索與正則表達(dá)式相匹配的值
- split经伙,把字符串分割為字符串?dāng)?shù)組
測試正則表達(dá)式是如何工作的
//test方法,測試字符串,符合模式時返回true,否則返回false
var re = /he/;//最簡單的正則表達(dá)式,將匹配he這個單詞
var str = "he";
alert(re.test(str));//true
str = "we";
alert(re.test(str));//false
str = "HE";
alert(re.test(str));//false,大寫,如果要大小寫都匹配可以指定i標(biāo)志(i是ignoreCase或case-insensitive的表示)
re = /he/i;
alert(re.test(str));//true
str = "Certainly!He loves her!";
alert(re.test(str));//true,只要包含he(HE)就符合,如果要只是he或HE,不能有其它字符,則可使用^和$
re = /^he/i;//脫字符(^)代表字符開始位置
alert(re.test(str));//false,因為he不在str最開始
str = "He is a good boy!";
alert(re.test(str));//true,He是字符開始位置,還需要使用$
re = /^he$/i;//$表示字符結(jié)束位置
alert(re.test(str));//false
str = "He";
alert(re.test(str));//true
//當(dāng)然,這樣不能發(fā)現(xiàn)正則表達(dá)式有多強(qiáng)大,因為我們完全可以在上面的例子中使用==或indexOf
re = /\s/;// \s匹配任何空白字符扶叉,包括空格、制表符帕膜、換頁符等等
str= "user Name";//用戶名包含空格
alert(re.test(str));//true
str = "user Name";//用戶名包含制表符
alert(re.test(str));//true
re=/^[a-z]/i;//[]匹配指定范圍內(nèi)的任意字符,這里將匹配英文字母,不區(qū)分大小寫
str="variableName";//變量名必須以字母開頭
alert(re.test(str));//true
str="123abc";
alert(re.test(str));//false
^脫字符代表字符開始位置
$表示字符結(jié)束位置
\s匹配任何空白字符枣氧,包括空格、制表符垮刹、換頁符等等
當(dāng)然达吞,僅僅知道了字符串是否匹配模式還不夠,我們需要知道哪些字符匹配了模式
var osVersion="Ubuntu 8"; //其中的8表示系統(tǒng)主版本號
var re=/^[a-z]+\s+\d+$/i; //+號表示字符至少要出現(xiàn)1次荒典,\s表示空白字符,\d表示一個數(shù)字
alert(re.test(osVersion)); //true,但我們想知道主版本號
//另一個方法exec,返回一個數(shù)組种蝶,數(shù)組的第一個元素為完整的匹配內(nèi)容
re=/^[a-z]+\s+\d+$/i;
arr=re.exec(osVersion);
alert(arr[0]);//將osVersion完整輸出瞒大,因為整個字符串剛好匹配re
//我只需要取出數(shù)字
re=/\d+/
var arr=re.exec(osVersion);
alert(arr[0])
更復(fù)雜的用法螃征,使用子匹配
re=/^[a-z]+\s+(\d+)$/i;
arr=re.exec(osVersion);
alert(arr[0]);//整個osVersion,也就是正則表達(dá)式的完整匹配
alert(arr[1]);//8,第一個子匹配踢械,事實(shí)也可以這樣取出主版本號
re=/^[a-z]+\s+(\d+)\.(\d+)$/i //.是正則表達(dá)式元字符之一,若要用它的字面意義須轉(zhuǎn)義
arr=re.exec(osVersion);
alert(arr[0]);
alert(arr[1]);
alert(arr[2]);
注意,當(dāng)字符串不匹配re時架专,exec方法將返回null
String對象的一些和正則表達(dá)式有關(guān)的方法
//replace對象的一些和正則表達(dá)式有關(guān)的方法
var str="some money";
alert(str.replace("some","much"));//much money
var re=/\s/; //空白字符
alert(str.replace(re,"%")); //some%money
//在不知道字符串有多少空白字符時,正則表達(dá)式極為方便
str="some some \tsome\t\f";
re=/\s+/
alert(str.replace(re,"#")); //但這樣只會將第一次出現(xiàn)的一堆空白字符替換掉//因為一個正則表達(dá)式只能進(jìn)行一次匹配,\s+匹配了第一個空格后就退出了
re=/\s+/g;//g灿椅,全局標(biāo)志,將使正則表達(dá)式匹配整個字符串
alert(str.replace(re,"@")); //some@some@some@//與另一個與之相似的是split
var str="a-bd-c"
var arr=str.split("-");//返回["a","bd","c"]
//如果str是用戶輸入的且警,他可能輸入a-bd-c也可能輸入a bd c或a_bd_c,但不會是adbc(這樣就說他輸錯了)
str="a_db-c"; //用戶以他喜歡的方式加分隔符s
re=/[^a-z]/i; //前面我們說^表示字符開始,但在[]里它表示一個負(fù)字符集//匹配任何不在指定范圍內(nèi)的任意字符滥朱,這里將匹配除字母處的所有字符
arr=str.split(re); //仍返回["a","bd","c"];
//在字符串中查找時我們常用indexOf,與之對應(yīng)用于正則查找的方法是search
str="My age is 18.Golden age!"; //年齡不是一定的颇象,我們用indexOf不能查找它的位置
re=/\d+/;
alert(str.search(re)); //返回查找到的字符串開始下標(biāo)10
//注意姐直,因為查找本身就是出現(xiàn)第一次就立即返回初斑,所以無需在search時使用g標(biāo)志
//下面的代碼雖然不出錯,但g標(biāo)志是多余的
re=/\d+/g;
alert(str.search(re)); //仍然是10
注意解恰,當(dāng)search方法沒有找到匹配時锋八,將返回-1
類似于exec方法,String對象的match方法也用于將字符串與正則表達(dá)式進(jìn)行匹配并返回結(jié)果數(shù)組
var str="My name is CJ.Hello eveyone!"
var re=/[A-Z]/;
var arr=str.match(re);
alert(arr); //數(shù)組中只會包含一個M护盈,因為我們沒有使用全局匹配
re=/[A-Z]/g;
arr=str.match(re);
alert(arr); //M,C,J,H
//從字符串中抽取單詞
re=/\b[a-z]*\b/gi; //\b表示單詞邊界
str="one two three four";
alert(str.match(re)); //one,two,three,four
RegExp對象實(shí)例的一些屬性
var re=/[A-Z]/;
//exec方法執(zhí)行后挟纱,修改re的lastIndex屬性
var str="Hello,World!!!";
var arr=re.exec(str);
alert(re.lastIndex); //0腐宋,因為沒有設(shè)置全局標(biāo)志
re=/[A-Z]/g;
arr=re.exec(str);
alert(re.lastIndex); //1
arr=re.exec(str);
alert(re.lastIndex); //7
當(dāng)匹配失敗紊服,后面沒有匹配,或lastIndex值大于字符串長度時胸竞,再執(zhí)行exec等方法會將lastIndex設(shè)為0欺嗤,開始位置
var re = /[A-Z]/;
var str = "Hello,World!!!";
re.lastIndex = 120;
var arr = re.exec(str);
alert(re.lastIndex);//0
RegExp對象的靜態(tài)屬性
//input 最后用于匹配的字符串(傳遞給test,exec方法的字符串)
var re = /[A-Z]/;
var str = "Hello,World!!!";
var arr = re.exec(str);
alert(RegExp.input);//Hello,World!!!
re.exec("tempstr");
alert(RegExp.input);//仍然是Hello,World!!!,因為tempstr不匹配
//lastMatch 最后匹配的字符
re = /[a-z]/g;
str = "hi";
re.test(str);
alert(RegExp.lastMatch);//h
re.test(str);
alert(RegExp["$&"]);//i ,$&是lastMatch的短名字,但由于它不是合法變量名撤师,所以要剂府。。
//lastParen 最后匹配的分組
re = /[a-z](\d+)/gi;
str = "Class1 Class2 Class3";
re.test(str);
alert(RegExp.lastParen);//1
re.test(str);
alert(RegExp["$+"]);//2
//leftContext 返回被查找的字符串中從字符串開始位置到最后匹配之前的位置之間的字符
//rigthContext 返回被搜索的字符串中從最后一個匹配位置開始到字符串結(jié)尾之間的字符
re = /[A-Z]/g;
str = "123ABC456";
re.test(str);
alert(RegExp.leftContext);//123
alert(RegExp.rightContext);//BC456
re.test(str);
alert(RegExp["$`"]);//123A
alert(RegExp["$'"]);//C456
multiline屬性返回正則表達(dá)式是否使用多行模式剃盾,這個屬性不針對某個正則表達(dá)式實(shí)例腺占,而是針對所有正則表達(dá)式,并且這個屬性可寫
alert(RegExp.multiline);
//因為IE痒谴,Opera不支持這個屬性衰伯,所以最好還是單獨(dú)指定
var re = /\w+/m;
alert(re.multiline);
alert(RegExp["$*"]);//RegExp對象的靜態(tài)屬性不會因為給RegExp某個對象實(shí)例指定了m標(biāo)志而改變
RegExp.multiline = true;//這將打開所有正則表達(dá)式實(shí)例的多行匹配模式
alert(RegExp.multiline);
使用元字符注意事項:元字符是正則表達(dá)式的一部分,當(dāng)我們要匹配正則表達(dá)式本身時积蔚,必須對這些元字符轉(zhuǎn)義.下面是正則表達(dá)式用到的所有元字符
( [ { \ ^ $ | ) ? * + .
var str="?";
var re=/?/;
alert(re.test(str));//出錯意鲸,因為?是元字符,必須轉(zhuǎn)義
re=/\?/; //通過\轉(zhuǎn)義
alert(re.test(str)); //true
使用RegExp構(gòu)造函數(shù)與使用正則表達(dá)式字面量創(chuàng)建正則表達(dá)式注意點(diǎn)
var str = "\?";
alert(str);//只會輸出?
var re = /\?/;//將匹配?
alert(re.test(str));//true
re = new RegExp("\?");//出錯,因為這相當(dāng)于re = /\?/
re = new RegExp("\\?");//正確,將匹配怎顾?
alert(re.test(str));//true
既然雙重轉(zhuǎn)義這么不友好读慎,還是用正則表達(dá)式字面量的聲明方式
怎樣在正則表達(dá)式中使用特殊字符
var re=/^\x43\x4A$/; //將匹配CJ
alert(re.test("CJ"));//true
//也可以使用八進(jìn)制方式
re=/^\103\112$/; //將匹配CJ
//還可以使用unicode編碼
re=/^\u0043\u004A$/; //使用unicode必須使用u開頭,接著是字符編碼的四位16進(jìn)制表現(xiàn)形式
alert(re.test("CJ"));
另處槐雾,還有一些其它的預(yù)定義特殊字符夭委,如下表所示:
字符 描述
\n 換行符
\r 回車符
\t 制表符
\f 換頁符(Tab)
\cX 與X對應(yīng)的控制字符
\b 退格符(BackSpace)
\v 垂直制表符
\0 空字符("")
字符類 ---〉簡單類,反向類募强,范圍類株灸,組合類,預(yù)定義類
//簡單類
var re = /[abc123]/;//將匹配abc123這6個字符中一個
//負(fù)向類
re = /[^abc]/;//將匹配除abc之外的一個字符
//范圍類
re = /[a-b]/;//將匹配小寫a-b 26個字母
re = /[^0-9]/;//將匹配除0-9 10個字符之處的一個字符
//組合類
re = /[a-b0-9A-Z_]/;//將匹配字母擎值,數(shù)字和下劃線
下面是正則表達(dá)式中的預(yù)定義類
代碼 等同于 匹配
. IE下[\n]慌烧,其它[\n\r] 匹配除換行符之外的任何一個字符
\d [0-9] 匹配數(shù)字
\D [^0-9] 匹配非數(shù)字字符
\s [ \n\r\t\f\x0B] 匹配一個空白字符
\S [^ \n\r\t\f\x0B] 匹配一個非空白字符
\w [a-zA-Z0-9_] 匹配字母數(shù)字和下劃線
\W [^a-zA-Z0-9_] 匹配除字母數(shù)字下劃線之外的字符
量詞(下表量詞單個出現(xiàn)時皆是貪婪量詞)
代碼 描述
匹配前面的子表達(dá)式零次或多次。例如鸠儿,zo* 能匹配 "z" 以及 "zoo"屹蚊。 * 等價于{0,}。
匹配前面的子表達(dá)式一次或多次捆交。例如淑翼,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"品追。+ 等價于 {1,}玄括。
? 匹配前面的子表達(dá)式零次或一次。例如肉瓦,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 遭京。? 等價于 {0,1}。
{n} n 是一個非負(fù)整數(shù)泞莉。匹配確定的 n 次哪雕。例如,'o{2}' 不能匹配 "Bob" 中的 'o'鲫趁,但是能匹配 "food" 中的兩個 o斯嚎。
{n,} n 是一個非負(fù)整數(shù)。至少匹配n 次挨厚。例如堡僻,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o疫剃。'o{1,}' 等價于 'o+'钉疫。'o{0,}' 則等價于 'o*'。
{n,m} m 和 n 均為非負(fù)整數(shù)巢价,其中n <= m牲阁。最少匹配 n 次且最多匹配 m 次固阁。劉, "o{1,3}" 將匹配 "fooooood" 中的前三個 o城菊。'o{0,1}' 等價于 'o?'备燃。請注意在逗號和兩個數(shù)之間不能有空格。
貪婪量詞與惰性量詞
?用貪婪量詞進(jìn)行匹配時凌唬,它首先會將整會字符串當(dāng)成一個匹配赚爵,如果匹配的話就退出,如果不匹配法瑟,就截去最后一個字符進(jìn)行匹配,如果不匹配唁奢,繼續(xù)將最后一個字符截去進(jìn)行匹配霎挟,直到有匹配為止。直到現(xiàn)在我們遇到的量詞都是貪婪量詞
?用惰性量詞進(jìn)行匹配時麻掸,它首先將第一個字符當(dāng)成一個匹配酥夭,如果成功則退出,如果失敗脊奋,則測試前兩個字符熬北,依些增加,直到遇到合適的匹配為止
var str = "abc";
var re = /\w+/;//將匹配abc
re = /\w+?/;//將匹配a
var re = /[a-z]$/;
var str = "ab\ncdef";
alert(str.replace(re,"#"));//ab\ncde#
re =/[a-z]$/m;
alert(str.replace(re,"#"));//a#\ncde#
分組與非捕獲性分組
re = /abc{2}/;//將匹配abcc
re = /(abc){2}/;//將匹配abcabc
//上面的分組都是捕獲性分組
str = "abcabc ###";
arr = re.exec(str);
alert(arr[1]);//abc
//非捕獲性分組 (?:)
re = /(?:abc){2}/;
arr = re.exec(str);
alert(arr[1]);//undefined
候選(也就是所說的“或”)
re = /^a|bc$/;//將匹配開始位置的a或結(jié)束位置的bc
str ="add";
alert(re.test(str));//true
re = /^(a|bc)$/;//將匹配a或bc
str ="bc";
alert(re.test(str));//true
當(dāng)包含分組的正則表達(dá)式進(jìn)行過test,match,search這些方法之后诚隙,每個分組都被放在一個特殊的地方以備將來使用讶隐,這些存儲是分組中的特殊值,我們稱之為反向引用
var re = /(A?(B?(C?)))/;
/*上面的正則表達(dá)式將依次產(chǎn)生三個分組
(A?(B?(C?))) 最外面的
(B?(C?))
(C?)*/
str = "ABC";
re.test(str);//反向引用被存儲在RegExp對象的靜態(tài)屬性1—1—9中
alert(RegExp.$1+"\n"+RegExp.$2+"\n"+RegExp.$3);
//反向引用也可以在正則表達(dá)式中使用\1 ,\2...這類的形式使用
re = /\d+(\D)\d+\1\d+/;
str = "2008-1-1";
alert(re.test(str));//true
str = "2008-4_3";
alert(re.test(str));//false
當(dāng)包含分組的正則表達(dá)式進(jìn)行過test,match,search這些方法之后久又,每個分組都被放在一個特殊的地方以備將來使用巫延,這些存儲是分組中的特殊值,我們稱之為反向引用
var re = /(A?(B?(C?)))/;
/*上面的正則表達(dá)式將依次產(chǎn)生三個分組
(A?(B?(C?))) 最外面的
(B?(C?))
(C?)*/
str = "ABC";
re.test(str);//反向引用被存儲在RegExp對象的靜態(tài)屬性1—1—9中
alert(RegExp.$1+"\n"+RegExp.$2+"\n"+RegExp.$3);
//反向引用也可以在正則表達(dá)式中使用\1 ,\2...這類的形式使用
re = /\d+(\D)\d+\1\d+/;
str = "2008-1-1";
alert(re.test(str));//true
str = "2008-4_3";
alert(re.test(str));//false
使用反向引用可以要求字符串中某幾個位置上的字符必須相同.另外地消,在replace這類方法中可用特殊字符序列來表示反向引用
re = /(\d)\s(\d)/;
str = "1234 5678";
alert(str.replace(re,"221"));//在這個里面1表示第一個分組1234,1表示第一個分組1234,2則表示5678
其它——〉正向前瞻,用來捕獲出現(xiàn)在特定字符之前的字符,只有當(dāng)字符后面跟著某個特定字符才去捕獲它炉峰。與正向前瞻對應(yīng)的有負(fù)向前瞻,它用匹配只有當(dāng)字符后面不跟著某個特定字符時才去匹配它脉执。在執(zhí)行前瞻和負(fù)向前瞻之類的運(yùn)算時疼阔,正則表達(dá)式引擎會留意字符串后面的部分,然而卻不移動index
//正向前瞻
re = /([a-z]+(?=\d))/i;
//我們要匹配后面跟一個數(shù)字的單詞半夷,然后將單詞返回婆廊,而不要返回數(shù)字
str = "abc every1 abc";
alert(re.test(str));//true
alert(RegExp.$1);//every
alert(re.lastIndex);//使用前瞻的好處是,前瞻的內(nèi)容(?=\d)并不會當(dāng)成一次匹配,下次匹配仍從它開始
//負(fù)向前瞻(?!)
re = /([a-z](?!\d))/;i
//將匹配后面不包含數(shù)字的字母,并且不會返回(?!\d)中的內(nèi)容
str = "abc1 one";
alert(re.test(str));
alert(RegExp.$1);//one
構(gòu)建一個驗證電子郵箱地址有效性的正則表達(dá)式玻熙。電子郵箱地址有效性要求(我們姑且這樣定義):用戶名只能包含字母數(shù)字以及下劃線否彩,最少一位,最多25位嗦随,用戶名后面緊跟@列荔,后面是域名敬尺,域名名稱要求只能包含字母數(shù)字和減號(-),并且不能以減號開頭或結(jié)尾贴浙,然后后面是域名后綴(可以有多個)砂吞,域名后綴必須是點(diǎn)號連上2-4位英文字母
var re = /^\w{1,15}(?:@(?!-))(?:(?:[a-z0-9-]*)(?:a-z0-9)(?:.(?!-)))+[a-z]{2,4}$/;
理解二
創(chuàng)建方式
- 直接量詞法
/parttrn/attributes - chuangjian RegExp對象的語法
new RegExp(pattern,attriubutes)
語法屬性說明:pattern我們寫的正則表達(dá)式規(guī)則,而attributes則是規(guī)則的修飾符崎溃,g為全局匹配蜻直,i為區(qū)分大小寫的匹配,m為多行匹配
語法
- 括號
用于查找某個范圍內(nèi)的字符
[acg]//匹配acg任一項即可
[^acg]//匹配acg之外的任何一個字符
[a-z]//匹配a-z
[A-Z]//匹配A-Z
(red|blue|green)//匹配其中任何一個即可
- 元字符
擁有特殊含義的字符
. //查找單個字符袁串,除了換行以及行結(jié)束符
\w //查找單詞字符
\W //查找非單詞字符
\d //查找數(shù)字
\D //查找非數(shù)字
\xxx //查找八進(jìn)制書xxx規(guī)定的字符
- 量詞
描述規(guī)則執(zhí)行的次數(shù)要求以及位置要求
n+ //匹配任何包含至少一個n的字符串
n? //匹配任何包含零個或者一個n的字符串
n* //匹配包含任一個n的字符串
n{x,y} //匹配包含x到y(tǒng)次n的字符串
^n //匹配開頭含有n的字符串
n$ //匹配結(jié)尾有n的字符串
?=n //匹配任何其后緊跟指定字符串n的字符串
?!n //匹配任何其后沒有緊跟字符串n的字符串
\b //匹配一個字邊界概而,即字與空格間的位置
\B //非字邊界匹配
- 方法
RegExp的方法 - compile編譯正則表達(dá)式
- exec執(zhí)行正則表達(dá)式,并返回找到的值與位置
- test檢查是否真的符合正則表達(dá)式的字符串囱修,返回布爾值
String對象的方法 - search 檢索與正則表達(dá)式相匹配的值
- match找到一個或多個正則表達(dá)式的匹配赎瑰、
- replace 替換與正則表達(dá)式相匹配的子串
- split 把字符串分割為字符串?dāng)?shù)組
子表達(dá)式
一個正則表達(dá)式可以分為許多子表達(dá)式
例子:利用子表達(dá)式可以將通用資源指示符(URI)分解為其組件。假定您想將下面的URI分解為協(xié)議(ftp破镰、http等等)餐曼、域地址和頁/路徑
var test = http://www.w3cschool.cc:80/html/html-tutorial.html;
/\w+:\/\/[^/:]+:\d*?[^# ]*/.exec(test)
//只可以匹配到鏈接
//輸出結(jié)果
["http://www.w3cschool.cc:80/html/html-tutorial.html",
index: 0, input: "http://www.w3cschool.cc:80/html/html-tutorial.html"]
/(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/.exec(test)
//不僅可以匹配到鏈接,還可以把鏈接分為各個部分輸出
//輸出結(jié)果
["http://www.w3cschool.cc:80/html/html-tutorial.html",
"http", "www.w3cschool.cc", ":80", "/html/html-tutorial.html",
index: 0, input: "http://www.w3cschool.cc:80/html/html-tutorial.html"]
貪婪的量詞
?*+三者都是貪婪的
因為他們會盡可能多的匹配字符串鲜漩,只要在后面添加一個源譬?就可以實(shí)現(xiàn)非貪婪或者最小匹配
<h1>Hello world!<h1>
//下面的表達(dá)式匹配從 < 到關(guān)閉h1標(biāo)記的 >之間的所有內(nèi)容
/<.*>/
//如果你只需要匹配開始的h1標(biāo)記,下面的非貪婪表達(dá)式只匹配<h1>
/<.*?>/
圓括號的副作用消除
圓括號有一個副作用孕似,那就是相關(guān)匹配會被緩存踩娘,此時可以在圓括號加上?:再寫正則表達(dá)式
/(?:<.*>)/
String.match(/<.+>/g) 與 RegExp.exec(string)的區(qū)別
- String.match(/<.+>/g)
這個是字符串方法喉祭,返回數(shù)組霸饲,包括與正則表達(dá)式匹配的第一個或者所有字符串,是否返回多個值由修飾符g決定(不返回子表達(dá)式的匹配結(jié)果) - RegExp.exec(String)
這個是正則表達(dá)式的對象特有方法臂拓,返回一個數(shù)組厚脉。數(shù)組包含:正則表達(dá)式匹配到的第一個字符串,各個子字符串匹配到的字符串胶惰。所以想要輸出()的子字符串匹配的字符串必須使用exec,(?:)同樣也只要在用exec的時候才能檢測到效果