Javascript中正則表達式的使用介紹

1. 如何創建正則表達式?

RegExp 對象表示正則表達式,它是對字符串執行模式匹配的強大工具。

直接量語法

/pattern/attributes
何時使用:使用固定的正則表達式時

創建 RegExp 對象的語法:

new RegExp(pattern, attributes);
何時使用:如果正則表達式需要動態拼接
 強調:"正則表達式"中的\都要變爲\\

參數

參數 pattern 是一個字符串,指定了正則表達式的模式或其他正則表達式。

參數 attributes 是一個可選的字符串,包含屬性 "g"、"i" 和 "m",分別用於指定全局匹配、區分大小寫的匹配和多行匹配。ECMAScript 標準化之前,不支持 m 屬性。如果 pattern 是正則表達式,而不是字符串,則必須省略該參數。

修飾符

修飾符描述
i執行對大小寫不敏感的匹配。
g執行全局匹配(查找所有匹配而非在找到第一個匹配後停止)。
m執行多行匹配。

方括號

方括號用於查找某個範圍內的字符:

表達式描述
[abc]查找方括號之間的任何字符。
[^abc]查找任何不在方括號之間的字符。
[0-9]查找任何從 0 至 9 的數字。
[a-z]查找任何從小寫 a 到小寫 z 的字符。
[A-Z]查找任何從大寫 A 到大寫 Z 的字符。
[A-z]查找任何從大寫 A 到小寫 z 的字符。
[adgk]查找給定集合內的任何字符。
[^adgk]查找給定集合外的任何字符。
(red|blue|green)查找任何指定的選項。

元字符

元字符(Metacharacter)是擁有特殊含義的字符:

元字符描述
.查找單個字符,除了換行和行結束符。
\w查找單詞字符。
\W查找非單詞字符。
\d查找數字。
\D查找非數字字符。
\s查找空白字符。
\S查找非空白字符。
\b匹配單詞邊界。
\B匹配非單詞邊界。
\0查找 NUL 字符。
\n查找換行符。
\f查找換頁符。
\r查找回車符。
\t查找製表符。
\v查找垂直製表符。
\xxx查找以八進制數 xxx 規定的字符。
\xdd查找以十六進制數 dd 規定的字符。
\uxxxx查找以十六進制數 xxxx 規定的 Unicode 字符。

量詞

量詞描述
n+匹配任何包含至少一個 n 的字符串。
n*匹配任何包含零個或多個 n 的字符串。
n?匹配任何包含零個或一個 n 的字符串。
n{X}匹配包含 X 個 n 的序列的字符串。
n{X,Y}匹配包含 X 或 Y 個 n 的序列的字符串。
n{X,}匹配包含至少 X 個 n 的序列的字符串。
n$匹配任何結尾爲 n 的字符串。
^n匹配任何開頭爲 n 的字符串。
?=n匹配任何其後緊接指定字符串 n 的字符串。
?!n匹配任何其後沒有緊接指定字符串 n 的字符串。

RegExp 對象屬性

RegExp 對象方法

方法描述FFIE
compile編譯正則表達式。14
exec檢索字符串中指定的值。返回找到的值,並確定其位置。14
test檢索字符串中指定的值。返回 true 或 false。14
 exec: 既獲得每個關鍵字的內容,又獲得每個關鍵字的位置:      var arr=reg.exec(str)      特點:1. 每次只返回一個關鍵字的內容,存在arr的[0] 如果找不到了,返回null           2. 將本次找到的關鍵字的位置保存在arr.index          3. 自動調整reg.lastIndex屬性爲下次開始的位置
var str="那天,我去了她家,我說:我草,你家真大。"+        "她要和我去草坪野餐。"+ "我草草收拾了餐桌。"+ "她說:我去去就來"; //我去   我草    我去草    我去去    我草草 var reg=/我[去草][去草]?/; var arr=null; while((arr=reg.exec(str))!=null){ //將str中所有敏感詞替換爲**或*** str=str.replace(reg,arr[0].length==2?"**":"***"); /*輸出: "在位置 ? 發現敏感詞 ?" console.log( "在位置 "+arr.index+" 發現敏感詞:"+arr[0]);*/ } console.log(str);//  驗證:var bool=reg.test(str);       如果str符合reg的要求,返回true,說明驗證通過       否則返回false,說明驗證未通過       ***強調:凡是驗證,前加^後加$       如果不加,只要局部匹配,就通過。
匹配指定位置:             ^匹配開始位置的xxx,比如: ^\s+匹配字符串開頭的空字符             $匹配結束位置的xxx,比如:\s+$ 匹配字符串結尾的空字符             匹配開頭或結尾的空字符:^\s+|\s+$              前加^後加$,且中間沒有|:^xxxx$必須和正則完全匹配             ***今後:做驗證:都要前加^,後加$             \b:表示單詞邊界:比如:\bno\b,只找單詞no

支持正則表達式的 String 對象的方法

方法描述FFIE
search檢索與正則表達式相匹配的值。14
match找到一個或多個正則表達式的匹配。14
replace替換與正則表達式匹配的子串。14
split把字符串分割爲字符串數組。


 查找:2種:
        1. 只判斷是否包含關鍵字:不考慮具體內容和個數
        	var i=str.search(reg); 
		只能返回第一個找到的關鍵字的位置
           找不到,返回-1
        2. 獲取所有關鍵字的內容:不考慮位置
                 var kwords=str.match(reg);
            返回所有關鍵字的內容,保存在kwords數組中
            ***找不到,返回null,都要先判斷不爲null,再使用;kwords.length,如果kwords爲null,則報錯!

 替換或刪除子字符串:
       var newStr=str.replace(reg,"替換字符");
       格式化字符串:
              正則表達式中的每個(),都是一個子表達式
              每個子表達式都會自動獲得一個從1開始的編號
       替換時,可用$n,指代本次匹配中第n個子表達式的對應內容 
<span style="background-color: rgb(204, 255, 255);"><script></span>
<span style="background-color: rgb(204, 255, 255);"><span style="white-space:pre">	</span>/*去掉字符串開頭或結尾的空字符*/	
	function ltrim(){//只去掉開頭的空字符
		//定義正則表達式只匹配開頭的空字符,保存在reg中
		//替換str中滿足reg規則的子字符串爲"", 並返回
		return str.replace(/^\s+/,"");
	}
	function rtrim(){//只去掉結尾的空字符
		//定義正則表達式只匹配結尾的空字符,保存在reg中
		//替換str中滿足reg規則的子字符串爲"", 並返回
		return str.replace(/\s+$/,"");
	}
	function trim(){//同時去掉開頭或結尾的字符
	//定義正則表達式匹配開頭或結尾的空字符,保存在reg中
		//替換str中滿足reg規則的子字符串爲"", 並返回
		return str.replace(/^\s+|\s+$/g,"");
	}
	var str=" \t  Hello World \t";
	console.log(ltrim()); //"Hello World \t"
	console.log(rtrim()); //" \t  Hello World"
	console.log(trim());    //"Hello World"</span>
<span style="background-color: rgb(204, 255, 255);"></script></span>


分隔字符串:
       var subs=str.split(reg[,count]);  
var stmt="we	two  who and     who";
	var words=stmt.split(/\s+/);
	console.log(words);
	//遍歷words中每個單詞
	for(var i=0;i<words.length;i++){
	//	將當前位置的單詞的首字母改爲大寫,再拼接上剩餘字符,再保存回當前位置
		words[i]=words[i][0].toUpperCase()
		        +words[i].slice(1);
	}//(遍歷結束)將words,按" "拼接爲新句子,存回stmt中
	stmt=words.join(" ");
	console.log(stmt); //"We Two Who And Who"


	var mail="[email protected]";
	var arr=mail.split(/@/);
	console.log("用戶名:"+arr[0]);
	console.log("域名:"+arr[1]);
var msg="Tom@補給兵@60%#Mary@醫護兵@80%#John@特種兵@30%"
	function show(){
		//按#切割msg,將結果保存在roles中
		var roles=msg.split(/#/);
		//遍歷roles中每個角色字符串
		for(var i=0;i<roles.length;i++){
		//	再按@切割當前角色字符串,結果保存在arr中
			var arr=roles[i].split(/@/);
		//  輸出:"名 兵種 生命:值"
			console.log(
				arr[0]+" "+arr[1]+" 生命:"+arr[2]);
		}
	}
	show();
	/*
		Tom 補給兵 生命:60%
		Mary 醫護兵 生命:80%
		John 特種兵 生命:30%
	*/

RegExp.$n: 獲得本次匹配中第n個子表達式匹配的內容 
	var birth="19831226";
	var reg=/(\d{4})(\d{2})(\d{2})/;
	        //  1      2      3
	birth=birth.replace(reg,"$1年$2月$3日");
	console.log(birth);
	var date="20151207一下050632";
	//定義正則reg
	var reg=/(\d{4})(\d{2})(\d{2})([\u4e00-\u9fa5])([\u4e00-\u9fa5])(\d{2})(\d{2})(\d{2})/;
	//用reg格式化date,再保存回date中
	date=date.replace(reg,"$1年$2月$3日 星期$4 $5午 $6:$7:$8");
	console.log(date);
	//"2015年12月07日 星期一 下午 05:06:32"

貪婪模式:


在使用修飾匹配次數的特殊符號時,有幾種表示方法可以使同一個表達式能夠匹配不同的次數,比如:"{m,n}", "{m,}", "?", "*", "+",具體匹配的次數隨被匹配的字符串而定。這種重複匹配不定次數的表達式在匹配過程中,總是儘可能多的匹配。比如,針對文本 "dxxxdxxxd",舉例如下:

貪婪模式:

表達式匹配結果
(d)(\w+)"\w+" 將匹配第一個 "d" 之後的所有字符 "xxxdxxxd"
(d)(\w+)(d)"\w+" 將匹配第一個 "d" 和最後一個 "d" 之間的所有字符 "xxxdxxx"。雖然 "\w+" 也能夠匹配上最後一個 "d",但是爲了使整個表達式匹配成功, "\w+" 可以 "讓出" 它本來能夠匹配的最後一個 "d"
 

由此可見,"\w+" 在匹配的時候,總是儘可能多的匹配符合它規則的字符。 雖然第二個舉例中,它沒有匹配最後一個 "d",但那也是爲了讓整個表達式能夠匹配成功。 同理,帶 "*" 和 "{m,n}" 的表達式都是儘可能地多匹配,帶 "?" 的表達式在可匹配可不匹配的時候, 也是儘可能的 "要匹配"。這 種匹配原則就叫作 "貪婪" 模式 。

非貪婪模式:     在修飾匹配次數的特殊符號後再加上一個 "?" 號,則可以使匹配次數不定的表達式儘可能少的匹配,使可匹配可不匹配的表達式,儘可能的 "不匹配"。這種匹配原則叫作 "非貪婪" 模式,也叫作 "勉強" 模式。如果少匹配就會導致整個表達式匹配失敗的時候,與貪婪模式類似,非貪婪模式會最小限度的再匹配一些,以使整個表達式匹配成功。舉例如下,針對文本 "dxxxdxxxd" 舉例:

表達式匹配結果
(d)(\w+?)"\w+?" 將儘可能少的匹配第一個 "d" 之後的字符,結果是:"\w+?" 只匹配了一個 "x"
(d)(\w+?)(d)爲了讓整個表達式匹配成功,"\w+?" 不得不匹配 "xxx" 纔可以讓後邊的 "d" 匹配,從而使整個表達式匹配成功。因此,結果是:"\w+?" 匹配 "xxx"

更多的情況,舉例如下:     舉例1:表達式 "<td>(.*)</td>" 與字符串 "<td><p>aa</p></td> <td><p>bb</p></td>" 匹配時,匹配的結果是:成功;匹配到的內容是 "<td><p>aa</p></td> <td><p>bb</p></td>" 整個字符串, 表達式中的 "</td>" 將與字符串中最後一個 "</td>" 匹配。      舉例2:相比之下,表達式 "<td>(.*?)</td>" 匹配舉例1中同樣的字符串時,將只得到 "<td><p>aa</p></td>", 再次匹配下一個時,可以得到第二個 "<td><p>bb</p></td>"。     

發佈了18 篇原創文章 · 獲贊 11 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章