正則表達式在javascript中的應用

1.正則表達式簡介

         正則表達式通常用於兩種任務:1.驗證,2.搜索/替換。用於驗證時,通常需要在前後分別加上^和$,以匹配整個待驗證字符串;搜索/替換時是否加上此限定則根據搜索的要求而定,此外,也有可能要在前後加上\b而不是^和$,如果是全文搜索還需要在後面加上g

如var reg=/\w*o(\w+)?/gi ,i表示不區分大小寫。

尊重他人勞動成果轉載請說明出處:http://blog.csdn.net/dxswzj/article/details/9111327

2.在javascript中使用正則表達式的函數介紹

        Javascript中有6個函數可以使用正則表達式:match、exec、test、search、replace、split。

        其中match,search,replace,split是String的方法,exec、test是RegExp類的方法

2.1 matcher

match是String的方法stringObj.match(rgExp),exec是RegExp類的方法

使用正則表達式模式對字符串執行查找,並將包含查找的結果作爲數組返回

stringObj.match(rgExp)
參數
stringObj
必選項。對其進行查找的 String 對象或字符串文字。
rgExp
必選項。爲包含正則表達式模式和可用標誌的正則表達式對象。也可以是包含正則表達式模式和可用標誌的變量名或字符串文字。
其餘說明與exec一樣,不同的是如果match的表達式匹配了全局標記g將出現所有匹配項,而不用循環,但所有匹配中不會包含子匹配項。

@例子:

<script language="javascript"type="text/javascript">

var objStr= "Yue I lOve you till theend of my life!";

var re=/\w*o(\w+)?/gi;

//該表達式用來匹配一個以/w代表的字符,第二個字符是o,後面有一個字符或者多個字符+表示前面的字符匹配的次數,全局匹配 ,後面的g表示繼續往下走即全局 i表示不區分大小寫,相當於 var re = newRegExp("\\w*o(\\w+)?","gi");  雙引號要加多一次轉義的\\w

var arr=objStr.match(re);

//調用match方法匹配字符串並且如果存在返回數組,如果沒有結果返回爲null

document.write("匹配前的字符串:"+objStr+"<br>");

if(arr!=null){//如果能匹配成功即arr數組不爲空,循環輸出結果

for(var i=0;i<arr.length;i++){

      document.write("<li>"+arr[i]);

}

}

</script>


輸出結果:

如果表達式改爲var re=/\w*o(\w+)?/g;則只輸出:you of 因爲對大小寫敏感lOve不匹配

2.2 exec

用正則表達式模式在字符串中查找,並返回該查找結果的第一個值(數組),如果匹配失敗,返回null.

如果執行exec方法的正則表達式沒有分組(沒有括號括起來的內容),那麼如果有匹配,他將返回一個只有一個元素的數組,這個數組唯一的元素就是該正則表達式匹配的第一個串;如果沒有匹配則返回null。
@例子1:下面兩個alert函數彈出的信息是一樣的:

JavaScript代碼

   <script>
    var str= "cat,hat" ;   
    var reg=/at/; //沒有g屬性   
    alert(reg.exec(str))   
    alert(str.match(reg))  



都是"at"。在這種場合下exec等價於match。但是如果正則表達式是全局匹配(g屬性)的,那麼以上代碼結果不一樣了:

@例子2:JavaScript代碼

<script>

var str= "cat,hat" ;   

var reg=/at/g; //注意g屬性  

alert(reg.exec(str))   

alert(str.match(reg))  

<script>


分別是
"at"
"at,at"。

@例子3當存在子匹配的情況

<script>

    var str= "cas245ssdt,hs3at" ;  

         varreg=/s+(\d+)/g;  

         document.write(reg.exec(str)+"<br>"); 

         document.write(str.match(reg));</script>

@輸出:s245,245

        s245,s3

@解釋:第一行輸出”s245,245”,是因爲exec只會匹配第一個值(數組),而且由於表達式reg裏有子表達式(即存在()),所有exec返回的數組有2個值,一個是表達式完全匹配的,一個是子表達式匹配的(即(\d+)),如果要方便取出可以這樣寫

  Var result = reg.exec(str);

             Document.write(“result[0]=”+ result[0]+”; result[1]=”+result[0]);

//@輸出:result[0]=s245;result[1]=245

第2行由於表達式後面加了(g屬性),全局匹配,所有輸出所有的匹配值s245,s3


2.3 test

返回一個 Boolean 值,它指出在被查找的字符串中是否匹配給出的正則表達式。RegExp類的方法;


var objStr=newString("3e234234!");  

var re = /^e\d+/;  // 必須以e開頭

var arr = re.test(objStr);//返回:false

var re = /e\d+/;

var arr = re.test(objStr);//返回:true


注意:test()繼承正則表達式的lastIndex屬性,表達式在匹配全局標誌g的時候須注意。

代碼如下:


function testDemo(){
var r, re; // 聲明變量。
var s = "I";
re = /I/ig; // 創建正則表達式模式。
document.write(re.test(s) + "<br/>"); // 返回 Boolean 結果。
document.write(re.test(s) + "<br/>");
document.write(re.test(s));
}
testDemo(); 



輸出結果:
true
false
true
當第二次調用test()的時候,lastIndex指向下一次匹配所在位置1,所以第二次匹配不成功,lastIndex重新指向0,等於第三次又重新匹配。下例顯示test的lastIndex屬性:
例子6:代碼如下:


function testDemo(){
var r, re; // 聲明變量。
var s = "I";
re = /I/ig; // 創建正則表達式模式。
document.write(re.test(s) + "<br/>"); // 返回 Boolean 結果。
document.write(re.lastIndex); // 返回 Boolean 結果。
}
testDemo(); 



輸出:
true
1
解決方法:將test()的lastIndex屬性每次重新指向0,re.lastIndex = 0;

2.4 search

返回與正則表達式查找內容匹配的第一個子字符串的位置(偏移位)。0開始,沒找到返回-1,與match一樣是String 類的方法:stringObj.search(rgExp)

@例子:

<script>

function SearchDemo(){

var r, re; // 聲明變量。

var s = "The rain in Spain fallsmainly in the plain.";

re = /the/i; // 創建正則表達式模式。

re2 = /tom/i;

r = s.search(re); // 查找字符串。

r2 = s.search(re2);

return("r:" + r +";r2:" + r2);

}

document.write(SearchDemo());

</script>


 

@輸出結果:r:0;r2:-1

2.5 replace

返回根據正則表達式進行文字替換後的字符串的複製。是String的方法

stringObj.replace(rgExp, replaceText);注意:replaceText可以是一個方法

 

@例子1替換爲特定文字

<scriptlanguage="javascript">

var s=prompt("請輸入在查找的字符","人");

var reg=/中華/g;

var str="中華人民共2和國,中華人民共和234國";

var newstr=str.replace(reg,"中國");

document.write(newstr);

</script>

@輸出:中國人民共2和國,中國人民共和234國

@例子2匹配字符改顏色(數字改爲紅色)

<scriptlanguage="javascript">

var s=prompt("請輸入在查找的字符","人");

var reg=/(\d)/g;

var str="中華人民共2和國,中華人民共和234國";

//$1是根據正則表達式裏的()內容匹配的東西

var newstr=str.replace(reg,"<fontcolor=red>$1</font>");
document.write(newstr);

</script>

@輸出:

關於子匹配下下面的介紹:

(pattern)

匹配pattern並獲取這一匹配。所獲取的匹配可以從產生的Matches集合得到,

在VBScript中使用SubMatches集合,在JScript中則使用$0…$9屬性。

要匹配圓括號字符,請使用“\(”或“\)”。

@例子3匹配內容修改

<scriptlanguage="javascript">

var str="他今年22歲,她今年20歲,他的爸爸今年45歲,她的爸爸今年44歲,一共有4人"

function test($0)

{

var gyear=(new Date()).getYear()-parseInt($0)+1;

     return $0+"("+gyear+"年出生)";

}

//var reg=new RegExp("(\\d+)歲","g");

reg = /(\d+)歲/g;

var newstr=str.replace(reg,test);

document.write(newstr);

</script>

@輸出:

看到了吧,有了正則表達式你可以對內容爲所欲爲。

@例子4多匹配

<script>

function f2c(s) {

var test =/([\d]{4})-([\d]{1,2})-([\d]{1,2})/;

 return(s.replace(test,kk));

}

function kk($0,$1,$2,$3) {

return($3+"/"+$2 +"/" +$1);

}

document.write("today:2011-03-29<br>");

document.write(f2c("today:2011-03-29"));

</script>


@輸出:

注意:這裏有$0\$1\$2\$3,這是由於表達式有(),表示表達式有子表達式。因爲有3個問號所有有3個子表達式。

$0取的是跟表示式完全匹配的字符串

$1取的是第一個子表達試相匹配的字符串即2011

$2取的是第一個子表達試相匹配的字符串即03

$3取的是第一個子表達試相匹配的字符串即29

2.6 split

將一個字符串分割爲子字符串,然後將結果作爲字符串數組返回。
stringObj.split([separator[, limit]])
參數
stringObj
必選項。要被分解的 String 對象或文字。該對象不會被 split 方法修改。
separator
可選項。字符串或正則表達式 對象,它標識了分隔字符串時使用的是一個還是多個字符。如果忽略該選項,返回包含整個字符串的單一元素數組。
limit
可選項。該值用來限制返回數組中的元素個數。

@例子:

<script>

function SplitDemo(){

var s, ss;

var s = "The rain /.,/.in Spain fallsmainly in the plain.";

// 正則表達式,用不分大不寫的s進行分隔。

ss = s.split(/\W+/i,5);//後面的5是可選項 表示只返回5個字符串

return(ss);

}

document.write("原值:The rain/.,/.in Spain falls mainly in the plain.<br>");

document.write("分解後:"+SplitDemo());

</script>  

@輸出:




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章