JavaScript RegExp 物件

什麼是 RegExp?

正規表示式描述了字元的模式物件。

當您檢索某個文字時,可以使用一種模式來描述要檢索的內容。 RegExp 就是這種模式。

簡單的模式可以是一個單獨的字元。

更複雜的模式包括了更多的字符,並可用於解析、格式檢查、替換等等。

您可以規定字串中的檢索位置,以及要檢索的字元類型,等等。

JavaScript提供了一個RegExp物件來完成有關正規表示式的操作和功能,每個正規表示式模式對應一個RegExp實例


#有兩種方式可以建立RegExp物件的實例。 
使用RegExp的明確建構函數,語法為:new RegExp("pattern"[,"flags"])。 
使用RegExp的隱式建構函數,採用純文字格式:/pattern/[flags]。 

pattern部分為要使用的正規表示式模式文本,是必須的。在第一種方式中,pattern部分以JavaScript字串的形式存在,需要使用雙引號或單引號括起來;在第二種方式中,pattern部分嵌套在兩個「/」之間,不能使用引號。 

flags部分設定正規表示式的標誌訊息,是可選項。如果設定flags部分,在第一種方式中,以字串的形式存在;在第二種方式中,以文字的形式緊接在最後一個「/」字元之後。 flags可以是以下標誌字元的組合。 
g是全域標誌。如果設定了這個標誌,對某個文字執行搜尋和取代操作時,將對文字中所有符合的部分起作用。如果不設定這個標誌,則僅搜尋和取代最早匹配的內容。 

<!DOCTYPE html>
<html>
<head> 
<meta charset="utf-8"> 
<title>php中文网(php.cn)</title> 
<script type="text/javascript">
var myString="这是第一个正则表达式的例子"; 
var myregex = new RegExp("一个"); // 创建正则表达式 
if (myregex.test(myString)){ 
document.write("找到了指定的模式!"); 
} 
else{ 
document.write("未找到指定的模式。"); 
} 
</script>
</head>
<body>
</body>
</html>

RegExp 修飾符

是全域標誌。如果設定了這個標誌,對某個文字執行搜尋和取代操作時,將對文字中所有符合的部分起作用。如果不設定這個標誌,則僅搜尋和取代最早匹配的內容。 
i 是忽略大小寫標誌。如果設定了這個標誌,進行配對比較時,將忽略大小寫。 
m 是多行標誌。如果不設定這個標誌,那麼元字元「^」只與整個被搜尋字串的起始位置相匹配,而元字元「$」只與被搜尋字串的結束位置相符。如果設定了這個標誌,「^」也可以與被搜尋字串中的「\n」或「\r」之後的位置(即下一行的行首)相匹配,而「$」也可以與被搜尋字串中的“\n”或“\r”之後的位置(即下一行的行尾)相符。 

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>php中文网(php.cn)</title>
</head>
<body>
<script>
var str="Is this all there is?";
var patt1=/is/gi;
document.write(str.match(patt1));
</script>
</body>
</html>


RegExp物件的屬性

RegExp物件的屬性分為靜態屬性和實例屬性。

1 靜態屬性 
(1)index屬性。是目前表達式模式首次符合內容的開始位置,從0開始計數。其初始值為-1,每次成功匹配時,index屬性都會隨之改變。 
(2)input屬性。傳回目前所作用的字串,可以簡寫為$_,初始值為空字串""。 
(3)lastIndex屬性。是當前表達式模式首次匹配內容中最後一個字元的下一個位置,從0開始計數,常被作為繼續搜索時的起始位置,初始值為-1,表示從起始位置開始搜索,每次成功匹配時,lastIndex屬性值都會隨之改變。 
(4)lastMatch屬性。是目前表達式模式的最後一個符合字串,可以簡寫為$&。其初始值為空字串""。在每次成功配對時,lastMatch屬性值都會隨之改變。 
(5)lastParen屬性。如果表達式模式中有括起來的子匹配,是當前表達式模式中最後的子匹配所匹配到的子字串,可以簡寫為$+。其初始值為空字串""。每次成功配對時,lastParen屬性值都會隨之改變。 
(6)leftContext屬性。是目前表達式模式最後一個符合字串左邊的所有內容,可以簡寫為$`(其中「'」為鍵盤上「Esc」下邊的反單引號)。初始值為空字串""。每次成功匹配時,其屬性值都會隨之改變。 
(7)rightContext屬性。是目前表達式模式最後一個符合字串右邊的所有內容,可以簡寫為$'。初始值為空字串""。每次成功匹配時,其屬性值都會隨之改變。 
(8)$1…$9屬性。這些屬性是唯讀的。如果表達式模式中有括起來的子匹配,$1…$9屬性值分別是第1個到第9個子匹配所捕捉到的內容。如果有超過9個以上的子匹配,$1…$9屬性分別對應最後的9個子匹配。在一個表達式模式中,可以指定任意多個括號的子匹配,但RegExp物件只能儲存最後的9個子匹配的結果。在RegExp實例物件的一些方法所傳回的結果陣列中,可以得到所有圓括號內的子符合結果。

2 實例屬性 
(1)global屬性。傳回建立RegExp物件實例時指定的global標誌(g)的狀態。如果在建立RegExp物件實例時設定了g標誌,則該屬性傳回True,否則傳回False,預設值為False。 
(2)ignoreCase屬性。傳回建立RegExp物件實例時指定的ignoreCase標誌(i)的狀態。如果在建立RegExp物件實例時設定了i標誌,則該屬性傳回True,否則傳回False,預設值為False。 
(3)multiLine屬性。傳回建立RegExp物件實例時指定的multiLine標誌(m)的狀態。如果在建立RegExp物件實例時設定了m標誌,則該屬性傳回True,否則傳回False,預設值為False。 
(4)source屬性。傳回建立RegExp物件實例時指定的表達式文字字串。 


RegExp物件的方法

1 test方法 
語法格式為test(str)。此方法檢查字串中是否存在建立RegExp物件實例時所指定的表達式模式,如果存在就傳回True,否則傳回False。如果找到符合項,則會更新RegExp物件中的相關靜態屬性,以反映符合情況。 

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>php中文网(php.cn)</title>
</head>
<body>
<script>
var str = 'php';
var patt1 = new RegExp('\w', 'g'); // 有转义作为正则表达式处理
var patt2 = new RegExp('\w', 'g');  // 无转义作为字符串处理
var patt3 =/\w+/g;  // 与 patt1 效果相同
document.write(patt1.test(str)) //输出 true
document.write("<br>") 
document.write(patt2.test(str)) //输出 false
document.write("<br>") 
document.write(patt3.test(str)) //输出 true
</script>
</body>
</html>

2 exec方法 
語法格式為exec(str)。此方法使用建立RegExp物件實例時所指定的表達式模式對一個字串進行搜索,並傳回一個包含搜尋結果的陣列。
如果為正規表示式設定了全域標誌(g),可以透過多次呼叫exec和test方法在字串中進行連續搜索,每次都是從RegExp物件的lastIndex屬性值指定的位置開始搜尋字元串。 
如果沒有設定全域標誌(g),則exec和test方法忽略RegExp物件的lastIndex屬性值,從字串的起始位置開始搜尋。 
如果exec方法沒有找到匹配,則傳回值為null;如果找到匹配,則傳回一個數組,並更新RegExp物件中有關靜態屬性以反映匹配情況。傳回數組中的元素0包含了完整的匹配結果,而元素1~n依序是表達式模式中定義的各個子匹配的結果。 
exec方法回傳的陣列有3個屬性,分別是input、index和lastIndex。 
input屬性是整個被搜尋的字串。 
index屬性是指符合在整個被搜尋字串中的位置。 
lastIndex屬性是指匹配的子字串的最後一個字元的下一個字元位置。 

<!DOCTYPE html>
<html>
<head> 
<meta charset="utf-8"> 
<title>php中文网(php.cn)</title> 
<script type="text/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>
</head>
<body>
</body>
</html>


繼續學習
||
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>php中文网(php.cn)</title> <script type="text/javascript"> var strSrc = "xxa1b01c001yya2b02c002zz"; var re = /a(\d)b(\d{2})c(\d{3})/gi; var arr, count = 0; while ((arr = re.exec(strSrc))!= null) { displayResult(); } function displayResult() { document.write("<p>这是用正则表达式/" + re.source + "/gi对字符串<br>" + RegExp.input + "进行第" + (++count) + "次搜索的结果:<br>"); document.write("RegExp.index为" + RegExp.index + "<br>"); document.write("RegExp.lastIndex为" + RegExp.lastIndex + "<br>"); document.write("RegExp.lastMatch为" + RegExp.lastMatch + "<br>"); document.write("RegExp.lastParen为" + RegExp.lastParen + "<br>"); document.write("RegExp.leftContext为" + RegExp.leftContext + "<br>"); document.write("RegExp.rightContext为" + RegExp.rightContext + "<br>"); document.write("RegExp.$1为" + RegExp.$1 + "<br>"); document.write("RegExp.$2为" + RegExp.$2 + "<br>"); document.write("RegExp.$3为" + RegExp.$3 + "<br>"); document.write("RegExp.$4为" + RegExp.$4 + "<br>"); document.write("arr.index为" + arr.index + "<br>"); document.write("arr.input为" + arr.input + "<br>"); document.write("arr.lastIndex为" + arr.lastIndex + "<br>"); document.write("返回数组的元素个数为" + arr.length + "<br>"); document.write("返回数组的内容为[]"); for(var i=0; i<arr.length; i++) { if(i < arr.length-1) document.write("" + arr[i] + ""); else document.write(("" + arr[i] + "")+"<p>"); } } </script> </head> <body> </body> </html>