摘要:類型通過類型來支持正則表達式。如由于構造函數的模式參數是字符串,所以在某些情況下要對字符串進行雙重轉義。而第二個循環使用構造函數在每次循環沖創建正則表達式。如另外,還有個用于存儲捕獲組的構造函數屬性。
EegExp 類型
ECMAScript 通過RegExp 類型來支持正則表達式。語法如下:
var expression = / pattern / flags;
每個正則表達式都可帶有一或多個標志(flags),正則表達式的匹配模式支持下列3 個標志。
g:表示全局(global)模式,該模式將被應用于所有字符串,而非在發現第一個匹配項時立即停止;
i:表示不區分大小寫(case-insensitive)模式,該模式在確定匹配項時忽略模式與字符串的大小寫;
m:表示多行(multiline)模式,在到達一行文本末尾時還會繼續查找下一行中是否存在與模式匹配的項;
如:
var pattern1 = /at/g; //匹配字符串中所有“at”的實例
var pattern2 = /[bc]at/i; //匹配字符串第一個“bat”或“cat”,不區分大小寫
var pattern3 = /.at/gi; //匹配字符串中所有以“at”結尾的3個字符串的組合,不區分大小寫
與其他語言中的正則表達式類似,模式中使用的所有元字符都必須轉義。正則表達式中的元字符包括:
( [ { ^ $ | ? * + . ] )
如:
var pattern1 = /[bc]at/i; //匹配第一個“[bc]at”,不區分大小寫; var pattern2 = /.at/gi; //匹配所有“.at”,不區分大小寫;
另外,還可以使用RegExp 構造函數,它接收兩個參數:一個是要匹配的字符串模式,另一個是可選的標志字符串。如:
var pattern1 = new RegExp("[bc]at","i");
由于RegExp 構造函數的模式參數是字符串,所以在某些情況下要對字符串進行雙重轉義。所有元字符串都必須雙重轉義,如 通常被轉義為 ,而在正則表達式中就會變成 。如:
/[bc]at/ => [bc]at /.at/ => .at /name/age/ => name/age /d.d{1,2}/ => d.d{1,2} /whello123/ => whello123
正則表達式字面兩始終會共享同一個RegExp 實例,而使用構造函數創建的每一個新RegExp 實例都是一個新實例。如:
var re = null,i; for (var i = 0; i < 10; i ++){ re = /cat/g; re.test("catastrophe"); } for (var i = 0; i < 10; i ++){ re = new RegExp("cat","g"); re.test("catastrophe"); }
對于第一個,由于會測試到字符串末尾,所以下次再調用test()就要從頭開始。而第二個循環使用RegExp 構造函數在每次循環沖創建正則表達式。因為媒體迭代都會創建一個新的RegExp 實例,所以每次調用text()都會返回true。
RegExp 實例屬性global:布爾值,是否設置了g;
ignoreCase:布爾值,是否設置了i;
multiline:布爾值,是否設置了m;
lastIndex:整數,開始搜索下一個匹配項的字符位置,從0 開始算起;
source:正則表達式的字符串表示,按照字面量形式返回;
如:
var pattern = new RegExp("[bc]at","i"); document.write(pattern.global); //false document.write(pattern.ignoreCase); //true document.write(pattern.multiline); //false document.write(pattern.lastIndex); //0 document.write(pattern.source); //[bc]at
注意最后一個,source 屬性保存的是規范形式的字符串,就是字面量形式所用的字符串。
RegExp 實例方法主要有兩個方法,一個是exec()方法,一個是test()方法。
exec()方法是專門為捕獲組而設計的。接收一個字符串參數,然后返回包含第一個匹配項信息的數組;或者null;返回的數組還額外包含兩個屬性:index 和input。在數組中,第一項是與整個模式匹配的字符串,其他項是與模式中的不活組匹配的字符串。如:
var text = "mom and dad and baby"; var pattern = /mom( and dad( and baby)?)?/gi; var matches = pattern.exec(text); console.log(matches.index); console.log(matches.input); console.log(matches[0]); console.log(matches[1]); console.log(matches[2]); /* [Log] 0 (repetition.html, line 33) [Log] mom and dad and baby (repetition.html, line 34) [Log] mom and dad and baby (repetition.html, line 35) [Log] and dad and baby (repetition.html, line 36) [Log] and baby (repetition.html, line 37) */
因為整個字符串本身與模式匹配,所以返回的數組matches 的index 為0;數組中的第一項是匹配的整個字符串,第二項包含與第一個不活租匹配的內容,第三項包含與第二個捕獲組匹配的內容。
第一個例子,這是一個全局模式:
var text = "this is a Global setting not a global function"; var pattern = /global/gi; var matches = pattern.exec(text); console.log(matches); //["Global"] console.log(matches.index); //10 console.log(matches.input); //this is a Global setting not a global function console.log(matches[1]); //undefined 這里沒有捕獲組 console.log(matches[0]); //Global console.log(pattern.lastIndex); //16 matches = pattern.exec(text); console.log(matches); //["global"]再次調用該exec()則繼續查找新的匹配項 console.log(matches.index); //31 console.log(pattern.lastIndex); //37
第二個例子,這不是一個全局模式:
var text = "this is a Global setting not a global function"; var pattern = /global/i; var matches = pattern.exec(text); console.log(matches); //["Global"] console.log(matches.index); //10 console.log(pattern.lastIndex); //0 matches = pattern.exec(text); console.log(matches); //["Global"] 這里仍然是Global,說明非全局模式會從頭開始搜索。 console.log(matches.index); //10 console.log(pattern.lastIndex); //0
全局模式,每次調用exec()都會返回字符串中的下一個匹配項;而非全局模式,每次調用exec()返回的都是第一個匹配項。
test()方法則是接收一個字符串參數。在模式與該參數匹配的情況下返回true;否則返回false。通常在只想知道目標字符串與某個模式是否匹配,但不需要知道文本內容的情況下,使用這個方法非常方便。
var text = "testing!"; var pattern = /est/gi; if (pattern.test(text)){ document.write("matched") }else{ document.write("not matched") }RegExp 構造函數屬性
這些屬性有一個長屬性名也有一個短屬性名。最常用的有兩個:
leftContext($` input 字符串中lastMatch 之前的文本);
rightContext ($" input 字符串中lastMatch 之后的文本);
其他幾個屬性Opera 和IE 對此兼容不好。有:
input ($_ 最近一次要匹配的字符串);
lastMatch ($& 最近的一次匹配項);
lastParen ($+ 最近一次的捕獲組);
multiline ($* 返回布爾值,表示是否所有表達式都使用多行模式);
如:
var text = "hello there"; var pattern = / /gi; if(pattern.exec(text)){ document.write("targeted" + "
"); document.write(RegExp.leftContext); document.write(RegExp.rightContext); }else{ document.write("missed" + "
"); }
又如:
var text = "hello there"; var pattern = / /gi; if(pattern.exec(text)){ document.write("targeted" + "
"); document.write(RegExp.input); //hello there document.write(RegExp.multiline); //false }else{ document.write("missed" + "
"); }
因為短屬性名不是有效的標識符,因此必須通過方括號語法來訪問它們。如RegExp["$""]
另外,還有9 個用于存儲捕獲組的構造函數屬性。語法是RegExp.$1`RegExp.$2`等等。如:
var text = "this has been a short summer"; var pattern = /(..)or(.)/g; if (pattern.test(text)){ document.write(RegExp.$1); document.write(RegExp.$2); }模式的缺陷
具體訪問模式的局限
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/86208.html
摘要:正則表達式一個描述字符模式的對象正則表達式的定義構造函數正則表達式直接量一對斜杠新特性正則的擴展引用類型類型的注意要點用于模式匹配的方法不支持全局搜索忽略表達式參數中的修飾符兩個參數第一個是正則表達式,第二個是要替換的字符串接收一個正則表達 正則表達式(regular expression):一個描述字符模式的對象 1 正則表達式的定義 RegExp()構造函數 正則表達式直接量(一...
摘要:由于某些字符類非常常用,的正則表達式中,使用特殊轉義字符表示他們。多行搜索代碼示例對象創建對象可以通過引用類型創建正則表達式對象參數參數被稱為模式,可以使任何簡單或復雜的正則表達式,包含字符類限定符分組向前查找以及反向引用等。 概述 正則表達式是什么 正則表達式(RegularExpression):由一些普通字符和特殊字符組成的,用以描述一種特定的字符規則的表達式。正則表達式常用在一...
摘要:被稱之為修飾符,用于表明正則表達式的行為。創建對象如下代碼類型于類型之間的區別使用運算符,類型返回,類型返回。提取字符串中的兩個指定的索引號之間的字符。在字符串中查找匹配的子串,并替換于正則表達式匹配的字串。 RegExp類型 概述 正則表達式時什么 正則表達式(Regular Expression):由一些普通字符和特殊字符組成的,用以描述一種特定的字符規則的表達式。正則表達式常用于...
摘要:變量作用域垃圾收集內存問題基本類型和引用類型中的變量包含基本類型值和引用類型值基本類型值指的是簡單的數據段引用類型值值那些可能有多個值構成的對象五種基本數據類型的值即基本類型值是按值訪問的因此操作的是保存在變量中實際的值引用類型值是保存在內 變量, 作用域, 垃圾收集(內存問題) 基本類型和引用類型 ES中的變量包含基本類型值和引用類型值 基本類型值指的是簡單的數據段 引用類型值值那些...
摘要:如很明顯可以看到,實際上是函數的局部變量。簡單的說就是,復制給參數,在函數內部是局部變量,無論怎么變化,都不影響的變化。 ECMAScript 變量可能包含兩種不同數據類型的值:基本類型值和引用類型值。 基本類型和引用類型的值 基本類型值(String,Number,Boolean,Null,Undefined)指的是簡單的數據段;引用類型值(保存在內存中的對象)指的是那些可能由多個值...
閱讀 1540·2023-04-26 02:50
閱讀 3548·2023-04-26 00:28
閱讀 1937·2023-04-25 15:18
閱讀 3218·2021-11-24 10:31
閱讀 989·2019-08-30 13:00
閱讀 1004·2019-08-29 15:19
閱讀 1774·2019-08-29 13:09
閱讀 2983·2019-08-29 13:06