JavaScript提供了一個RegExp對象來完成有關正則表達式的操做和功能,每一條正則表達式模式對應一個RegExp實例。有兩種方式能夠建立RegExp對象的實例。javascript
使用RegExp的顯式構造函數,語法爲:new RegExp("pattern"[,"flags"])。 ~~~構造函數 new RegExp(..)html
使用RegExp的隱式構造函數,採用純文本格式:/pattern/[flags]。 ~~~正則字面量java
pattern部分爲要使用的正則表達式模式文本,是必須的。在第一種方式中,pattern部分以JavaScript字符串的形式存在,須要使用雙引號或單引號括起來;在第二種方式中,pattern部分嵌套在兩個「/」之間,不能使用引號。正則表達式
flags部分設置正則表達式的標誌信息,是可選項。若是設置flags部分,在第一種方式中,以字符串的形式存在;在第二種方式中,以文本的形式緊接在最後一個「/」字符以後。flags能夠是如下標誌字符的組合。數組
g是全局標誌。若是設置了這個標誌,對某個文本執行搜索和替換操做時,將對文本中全部匹配的部分起做用。若是不設置這個標誌,則僅搜索和替換最先匹配的內容。函數
i是忽略大小寫標誌。若是設置了這個標誌,進行匹配比較時,將忽略大小寫。spa
m是多行標誌。若是不設置這個標誌,那麼元字符「^」只與整個被搜索字符串的開始位置相匹配,而元字符「$」只與被搜索字符串的結束位置相匹配。若是設置了這個標誌,「^」還能夠與被搜索字符串中的「\n」或「\r」以後的位置(即下一行的行首)相匹配,而「$」還能夠與被搜索字符串中的「\n」或「\r」以後的位置(即下一行的行尾)相匹配。code
代碼1.1是一個建立正則表達式的例子。xml
代碼1.1 建立正則表達式:1.1.htmhtm
<html>
<head>
<title>建立正則表達式 </title>
<script language = "JavaScript">
var myString="這是第一個正則表達式的例子";
var myregex = new RegExp("一個"); // 建立正則表達式
if (myregex.test(myString)){
document.write("找到了指定的模式!");
}
else{
document.write("未找到指定的模式。");
}
</script>
</head><body></body>
</html>
上面代碼的運行結果如圖8.1所示。
因爲JavaScript字符串中的「\」是一個轉義字符,所以,使用顯式構造函數建立RegExp實例對象時,應將原始正則表達式中的「\」用「\\」替換。例如,在代碼1.2中的兩條語句是等價的。
代碼1.2 轉義字符中的「\」:1.2.htm
<script language="javascript">
var re1 = new RegExp("\\d{5}");
var re2 = /\d{5}/;
alert("re1="+re1+"\nre2="+re2);
</script>
因爲正則表達式模式文本中的轉義字符也是「\」,若是正則表達式中要匹配原義字符「\」,在正則表達式模式文本中要以「\\」來表示,當使用顯式構造函數的方式建立RegExp實例對象的時候,就須要使用「\\\\」來表示原義字符「\」。
var re = new RegExp("\\\\")。
RegExp對象的屬性分爲靜態屬性和實例屬性。下面分別進行介紹。
-----------------------------------------------------------
re = /\w(\d)/g;
re.source
re.global
re.multiline
re.ignoreCase
re.lastIndex // with 'g' option , reg.exec('sdfdf3sdf')
-----------------------------------------------------------
rst = re.exec('sdewer4erer');
rst.index
rst.input, RegExp.input, RegExp.$input, RegExp.$_
-----------------------------------------------------------
RegExp.$1, RegExp.$2 ..... RegExp.$9
RegExp.lastMatch, RegExp['$&']
RegExp.lastParen, RegExp['$+']
RegExp.leftContext, RegExp["$`"]
RegExp.rightContext, RegExp["$'"]
-----------------------------------------------------------
re = /\w(\d)/g ;
rst = re.exec('itisalready9oclock');
(1)rst.index屬性。是當前表達式模式首次匹配內容的開始位置,從0開始計數。其初始值爲-1,每次成功匹配時,index屬性都會隨之改變。
(2)rst.input, RegExp.input屬性。返回當前所做用的字符串,能夠簡寫爲RegExp.$_,初始值爲空字符串""。
(3)re.lastIndex屬性。是當前表達式模式首次匹配內容中最後一個字符的下一個位置,從0開始計數,常被做爲繼續搜索時的起始位置,初始值爲-1,表示從起始位置開始搜索,每次成功匹配時,lastIndex屬性值都會隨之改變。
(4)RegExp.lastMatch屬性。是當前表達式模式的最後一個匹配字符串,能夠簡寫爲$& RegExp['$&']。其初始值爲空字符串""。在每次成功匹配時,lastMatch屬性值都會隨之改變。
(5)RegExp.lastParen屬性。若是表達式模式中有括起來的子匹配,是當前表達式模式中最後的子匹配所匹配到的子字符串,能夠簡寫爲$+ RegExp['$+']。其初始值爲空字符串""。每次成功匹配時,lastParen屬性值都會隨之改變。
(6)RegExp.leftContext屬性。是當前表達式模式最後一個匹配字符串左邊的全部內容,能夠簡寫爲$` RegExp["$`"](其中「'」爲鍵盤上「Esc」下邊的反單引號)。初始值爲空字符串""。每次成功匹配時,其屬性值都會隨之改變。
(7)RegExp.rightContext屬性。是當前表達式模式最後一個匹配字符串右邊的全部內容,能夠簡寫爲$’ RegExp["$'"] (單引號)。初始值爲空字符串""。每次成功匹配時,其屬性值都會隨之改變。
(8)RegExp.$1…$9屬性。這些屬性是隻讀的。若是表達式模式中有括起來的子匹配,$1…$9屬性值分別是第1個到第9個子匹配所捕獲到的內容。若是有超過9個以上的子匹配,$1…$9屬性分別對應最後的9個子匹配。在一個表達式模式中,能夠指定任意多個帶括號的子匹配,但RegExp對象只能存儲最後的9個子匹配的結果。在RegExp實例對象的一些方法所返回的結果數組中,能夠得到全部圓括號內的子
RegExp對象的經常使用方法有test、exec和compile,本節介紹這些方法的功能和用法。最後,對RegExp對象的屬性和方法進行一個綜合舉例。
語法格式爲test(str)。該方法檢查一個字符串中是否存在建立RegExp對象實例時所指定的表達式模式,若是存在就返回True,不然返回False。若是找到匹配項,則會更新RegExp對象中的有關靜態屬性,以反映匹配狀況。
2.2 exec方法
語法格式爲exec(str)。該方法使用建立RegExp對象實例時所指定的表達式模式對一個字符串進行搜索,並返回一個包含搜索結果的數組。
若是爲正則表達式設置了全局標誌(g),能夠經過屢次調用exec和test方法在字符串中進行連續搜索,每次都是從RegExp對象的lastIndex屬性值(re.lastIndex)指定的位置開始搜索字符串。
若是沒有設置全局標誌(g),則exec和test方法忽略RegExp對象的lastIndex屬性值,從字符串的起始位置開始搜索。
若是exec方法沒有找到匹配,返回值爲null;若是找到匹配,則返回一個數組,並更新RegExp對象中有關靜態屬性以反映匹配狀況。返回數組中的元素0包含了完整的匹配結果,而元素1~n依次是表達式模式中定義的各個子匹配的結果。
exec方法返回的數組有2個屬性,分別是input、index
rst.input屬性是整個被搜索的字符串。
rst.index屬性是指匹配在整個被搜索字符串中的位置。
re.lastIndex屬性是指匹配的子字符串的最後一個字符的下一個字符位置。
代碼2.1是對該方法的應用舉例。
代碼2.1 exec()方法應用:2.1.htm
<html>
<head>
<title>exec()方法應用</title>
<script language = "JavaScript">
var myString="aaa 111 bbb 222 ccc 1111 222ddd";
var regex = /111/; //建立正則表達式對象
var array=regex.exec(myString);
if (array){
var str="找到了匹配子串!"+"\n返回數組的值爲:"+array+"\n數組元素個數:"
+array.length+"\n被搜索的字符串爲:"+array.input
+"\n匹配子串的開始位置爲:"+array.index
+"\n匹配子串後面第一個字符的位置爲:"+regex.lastIndex;
alert(str);
}
else{
alert("未找到匹配子串!!");
}
</script>
<body></body>
</html>
語法格式爲compile("pattern"[,"flags"])。該方法能夠更換RegExp對象實例所使用的表達式模式,並將新的表達式模式編譯爲內部格式,從而使之後的匹配過程執行更快。若是要在循環中重複使用某個表達式,對其進行編譯將使執行加速。可是,若是在程序中使用了任何其餘表達式模式後,再使用原來編譯過的表達式模式,則這種編譯毫無 益處。
代碼2.2是對RegExp對象的綜合舉例,認真分析代碼及其運行結果,能夠更好地理解RegExp對象。
代碼2.2 RegExp對象的使用:2.2.htm
1 var strSrc = "xxa1b01c001yya2b02c002zz"; 2 3 var re = /a(\d)b(\d{2})c(\d{3})/gi; 4 5 var arr, count = 0; 6 7 /* /pattern/g 注意g標識 這樣才能終止循環 */ 8 while ((arr = re.exec(strSrc)) != null) 9 10 { 11 12 displayResult(); 13 14 } 15 16 function displayResult() 17 18 { 19 20 document.write("<p>這是用正則表達式/" + re.source + "/gi對字符串<br>" 21 22 + RegExp.input + "進行第" + (++count) + "次搜索的結果:<br>"); 23 24 document.write("arr.index爲: " + arr.index + "<br>"); 25 26 document.write("re.lastIndex爲: " + re.lastIndex + "<br>"); 27 28 document.write("RegExp.lastMatch爲: " + RegExp.lastMatch + "<br>"); 29 30 document.write("RegExp.lastParen爲: " + RegExp.lastParen + "<br>"); 31 32 document.write("RegExp.leftContext爲: " + RegExp.leftContext + "<br>"); 33 34 document.write("RegExp.rightContext爲: " + RegExp.rightContext + "<br>"); 35 36 document.write("RegExp.$1爲: " + RegExp.$1 + "<br>"); 37 38 document.write("RegExp.$2爲: " + RegExp.$2 + "<br>"); 39 40 document.write("RegExp.$3爲: " + RegExp.$3 + "<br>"); 41 42 document.write("RegExp.$4爲: " + RegExp.$4 + "<br>"); 43 44 document.write("arr.index爲: " + arr.index + "<br>"); 45 46 document.write("arr.input爲: " + arr.input + "<br>"); 47 48 document.write("返回數組的元素個數爲: " + arr.length + "<br>"); 49 50 document.write("返回數組的內容爲: :["); 51 52 for(var i=0; i<arr.length; i++) 53 54 { 55 56 if(i < arr.length-1) 57 58 document.write("'" + arr[i] + "',"); 59 60 else 61 62 document.write("'" + arr[i] + "']</p>"); 63 64 } 65 66 }