摘要:構造函數可以有兩個字符串參數,第一個參數包含正則表達式的主體部分。只讀的布爾值,說明這個正則表達式是否帶有修飾符。中正則的擴展構造函數在中,只能接受字符串作為參數,允許其直接接受正則表達式作為參數。
上文傳送門:初探正則表達式
正則表達式是一個描述字符模式的對象,JavaScript 的 RegExp 類表示正則表達式,String 和 RegExp 都定義了方法,后者使用正則表達式進行強大的模式匹配和文本檢索于替換功能。JavaScript 的正則表達式語法是 Perl5 的正則表達式語法的子集。
JS中正則表達式的定義JavaScript 中的正則表達式用RegWxp對象表示,可以使用RegExp()構造函數來創建RegExp對象,不過RegExp對象更多的是通過一種特殊的直接量語法來創建。就像通過引號包裹字符的方式來定義字符串直接量一樣,正則表達式直接量定義為包含在一對斜杠(/)之間的字符,比如:
var someReg = /s$/ var someReg2 = new RegExp("s$")
其實,這兩個表達式是等價的,都匹配以字母s結尾的字符串,只不過第一個以直接量定義,第二個以正則表達式定義。
js中正則表達式的修飾符修飾符 | 說明 |
---|---|
i | 執行不區分大小寫的匹配 |
g | 執行一個全局匹配,即找到所有匹配而不是找到一個就停止 |
m | 多行匹配模式 ^ 匹配一行的開頭和字符串的開頭 $ 匹配行的結束和字符串的結束 |
String 支持4種使用正則表達式的方法。
1. search()"JavaScript".search(/script/i);
search() 的參數是一個正則表達式,返回第一個與之匹配的字串的起始位置,如果到不到匹配的字串,它將返回 -1,如果它的參數不是正則表達式,則首先會通過RegExp構造函數將他轉化成正則表達式,它不支持全局搜索,因為它忽略正則表達式中的修飾符 g。上面的表達式將返回 4。
2. replace()text.replace(/javascript/gi, "JavaScript");
replace() 用來執行檢索和替換操作。其中第一個參數是一個正則表達式,第二個參數是要進行替換操作的字符串。這個方法會對調用它的字符串進行檢索,使用指定的模式來匹配。如果 replace() 的第一個參數是一個字符串,那么它將直接搜索這個字符串,而不是和 search() 一樣先通過 RegExp()將它轉換成正則表達式。上面的表達式將文本中所有的 javascript (不區分大小寫)統一替換為 JavaScript。
3. march():"1 and 2 and 3".match(/d+g);
match() 方法是最常用的String正則表達式方法。它唯一的參數就是一個正則表達式,返回的是一個匹配結果組成的數組。如果該表達式設置了修飾符 g,則該方法反悔的數組中包括了字符串中所有匹配結果。如果這個這個正則表達式沒有設置修飾符 g,它只檢索第一個匹配。但是即使它不是全局匹配,它也返回一個數組,在這種情況下,數組的第一個元素就是匹配的字符串,剩下的元素則是正則表達式中用圓括號擴起來的子表達式。上面代碼返回 ["1","2","3"]
4. split()"123,456,789".split(",");
這個方法將調用他的字符串拆分成一個字串組成的數組,使用的分隔符是 split() 的參數,它的參數也可以是一個正則表達式。上面的代碼返回 ["123","456","789"]。
RegExp對象除了 RegExp() 構造函數以外,RegExp 對象還支持三個方法和一些屬性。
RegExp()構造函數可以有兩個字符串參數,第一個參數包含正則表達式的主體部分。需要注意的是不管是字符串直接量還是正則表達式,都是用 作為轉義字符的前綴,因此當給構造函數傳入一個字符串表述的正則表達式時,必須要將 替換成 。如果提供第二個參數,它就制定正則表達式的修飾符。
var thisReg = new RegExp("d{5}","g");
RegExp的屬性source: 只讀的字符串,包含正則表達式的文本。
global: 只讀的布爾值,說明這個正則表達式是否帶有修飾符 g。
ignoreCase: 只讀的布爾值,說明這個正則表達式是否帶有修飾符 i。
multiline: 只讀的布爾值,說明這個正則表達式是否帶有修飾符 m。
lastIndex: 可讀寫的整數,如果這個正則表達式帶有修飾符 g ,這個屬性儲存在整個字符串中下次檢索的開始位置,這個屬性會被 exec() 和 test() 方法用到。
RegExp的方法RegExp對象定義了兩個用于執行模式匹配操作的方法。
1. exec()它與我們之前介紹的 match() 相似,只是它的參數是一個字符串,而 match() 的參數是一個RegExp對象。
exec() 對一個指定的字符串執行匹配檢索。如果它沒有找點任何匹配,它就返回 null,但是如果他找到一個匹配,它將返回一個數組,這個數組第一個元素包含的是與正則表達式相匹配的字符串,余下的就是正則表達式括號內的子表達式。
和 match() 不同,不管正則表達式是否具有全局修飾符 g,exec() 都會返回一樣的數組。當調用 exec() 的正則表達式對象具有修飾符 g 的時候,它把當前正則表達式的 lastindex 屬性設置為緊挨著匹配字串的字符位置。當同一個字符串第二次調用 exec() 的時候,他將會從 lastIndex 所指示的字符位置開始檢索。如果沒有任何匹配結果,他將會把 lastIndex 設置為 0(我們也可以在任何時候進行設置)。
2. test()調用 test() 和調用 exec() 等價,當 exec() 的返回結果不是 null 的時候,test() 返回 true。由于這種等價性,當一個全局表達式調用 test() 時,它的行為和 exec() 一樣。
ES6中正則的擴展 RegExp構造函數在ES5中,RegExp() 只能接受字符串作為參數,ES6允許其直接接受正則表達式作為參數。
let regex = new RegExp(/xyz/i)
字符串的正則方法ES6中將字符串對象的4個正則方法在語言內部全部調用 RegExp 的實例方法,使得所有與正則有關的方法全部都定義在了 RegExp 對象上。
如 String.prototype.match 調用 RegExp.prototype[Symbol.match]
u修飾符ES6對正則表達式增加了 u 修飾符,含義為“Unicode模式”,用來正確處理大于 uFFFF 的Unicode字符。
y修飾符ES6還為正則表達式添加了 y 修飾符。他的作用和 g 修飾符類似,也是全局匹配,后一次匹配都從上一次匹配成功的下一位置開始。不同之處在于,g 修飾符只要剩余位置中存在匹配就行,而 y 修飾符會確保匹配從剩余的第一個位置開始。g 修飾符會忽略非法字符, y 不會。
let s = "aaa_aa_a"; let r1 = /a+/g; let r2 = /a+/y; r1.exec(s) // ["aaa"] r2.exec(s) // ["aaa"] r1.exec(s) // ["aa"] r2.exec(s) // nullsticky屬性
與 y 修飾符對應,ES6的正則對象對了 sticky 屬性,用來表示是否設置了 y 修飾符。
flags屬性ES6為正則表達式新增了 flags 屬性,返回正則表達式的修飾符。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/95028.html
摘要:控制權和傳動這兩個詞可能在搜一些博文或者資料的時候會遇到,這里做一個解釋先控制權是指哪一個正則子表達式可能為一個普通字符元字符或元字符序列組成在匹配字符串,那么控制權就在哪。 溫馨提示:文章很長很長,保持耐心,必要時可以跳著看,當然用來查也是不錯的。 正則啊,就像一座燈塔,當你在字符串的海洋不知所措的時候,總能給你一點思路;正則啊,就像一臺驗鈔機,在你不知道用戶提交的鈔票真假的時候,...
摘要:表示非單詞字符,等效于正則教程返回完整的字符串,因為,中文算作是非單詞字符。行首行尾,修飾符形式修飾符的作用是修改和在正則表達式中的作用,讓它們分別表示行首和行尾。 正則 描述 正則 描述 f 匹配換頁符 匹配制表符 匹配換行符 v 匹配垂直制表符 匹配回車 s 匹配單個空格,等同于[f v]; S...
摘要:說來慚愧,做前端快三年對于正則表達式的應用還是很淺薄,大家都知道正則的速度基本上是最快的,但就是懶得去記那些語法和規則,這次項目中多次用到了需要匹配替換的動作,終于下定決心去研究一下了。 說來慚愧,做前端快三年對于正則表達式的應用還是很淺薄,大家都知道正則的速度基本上是最快的,但就是懶得去記那些語法和規則,這次項目中多次用到了需要匹配替換的動作,終于下定決心去研究一下了。 實例化正則對...
閱讀 2081·2023-04-25 19:03
閱讀 1230·2021-10-14 09:42
閱讀 3411·2021-09-22 15:16
閱讀 950·2021-09-10 10:51
閱讀 1564·2021-09-06 15:00
閱讀 2405·2019-08-30 15:55
閱讀 489·2019-08-29 16:22
閱讀 896·2019-08-26 13:49