RegExp 是正則表達式的縮寫。javascript
正則表達式( regular expression)描述了一種字符串匹配的模式。能夠用來:java
(1)檢查一個串中是否含有符合某個規則的子串,而且能夠獲得這個子串;正則表達式
(2)根據匹配規則對字符串進行靈活的替換操做express
正則表達式在線測試網站,https://regexper.com/ 數組
經過該網站,能夠經過圖形化的界面去領會正則表達式的含義,將更加直觀和容易理解函數
RegExp對象:測試
JavaScript經過內置對象RegExp來支持正則表達式網站
有兩種方法實例化RegExp對象:spa
一、字面量 :如 var reg = /\bis\b/g;prototype
二、構造函數 : 如 var reg = new RegExp('\\bis\\b','g');
修飾符: g:global全文搜索,不添加,搜索到第一個匹配就中止
i:ignore case忽略大小寫,默認大小寫敏感
m:multiple lines 多行搜索
正則表達式主要有一下兩種字符組成:
一、原義文本字符(普通字符):
字母、數字、漢字、下劃線、以及沒有特殊定義的標點符號,都是"普通字符"表達式中的普通字符。在匹配一個字符串的時候,匹配與之相同一個字符 如:a,b,
二、元字符:
指的是在正則表達式中具備特殊含義的非字母字符(轉義字符) ,如\n換行符 \t水平製表符 \v垂直製表符 \r回車符 \o空字符 \f換頁符 \cX與X對應的控制字符(ctrl+x)
特殊元字符:. * + $ ^| \(){}[]
字符類:
使用元字符[]來構建的一個簡單類,所謂類是指符合某些特性的對象,一個泛指,而不是特質某一個字符,如:[abc]把字符a、b、c歸爲一類,表達式能夠匹配這些字符
[abc]
範圍類:
可使用[a-z]來鏈接兩個字符,表示從a到z的任意字符,這是個閉區間,包含了a和z字符
在[]組成的類內部是能夠連寫的,好比[a-zA-Z]
預約義類和邊界:
匹配一個ab+數字+任意字符 的字符串 如:ab[0-9][^\r\n]
正則表達式提供了幾個經常使用的邊界表達式,如圖
注意:^放在[]裏面,就表示除xxx字符以外,放在外面則表示以xxx開始
量詞:
若是但願一個連續出現20次的數字字符串,能夠採起這種形式 \d{20}
\d{20}\w\d?\w+\d*\d{3}\w{3,5}\d{3,}
貪婪模式和非貪婪模式:
貪婪模式:\d{3,6} ,儘量多的匹配
非貪婪模式:讓正則表達式儘量少的匹配,也就是說一旦成功匹配了就再也不嘗試,在後面加個?號便可
分組:
配置字符串Byron連續出現3次的場景,
Byron{3} 實際效果:
() 圓括號: 能夠達到分組的功能,使量詞做用於分組
|或:使用|能夠達到或的效果 Byron | Casper
也能夠這樣結合分組使用 Byr(on|Ca)sper
選擇出來的是符合Byronsper或者ByronCasper
反向引用
將2015-12-25 =>12/25/2015
前瞻:
正則表達式從文本頭部向尾部開始解析,文本尾部方向,稱爲‘前’
前瞻就是在正則表達式匹配到規則的時候,向前檢查是否符合斷言,後顧/後瞻方向相反
javascript不支持後顧
符合和不符合特定斷言稱爲確定/正向匹配和否認/負向匹配
\w(?=\d)
\w(?!\d)
分析:從第一個字符'a'開始,知足\w,後跟'2',符合斷言'\d’,所以a被X所替換
分析同上
對象屬性:
global全文搜索,不添加,搜索到第一個匹配就中止 默認值false
ignore case忽略大小寫,默認大小寫敏感 默認值false
multiple lines 多行搜索 ,默認值false
lastIndex:是當前表達式匹配內容的最後一個字符的下一個位置
source:正則表達式的文本字符串
這幾個屬性都是隻讀的,不能手動設置
RegExp的test和exec方法:
RegExp.prototype.test(str) :
用於測試字符串參數中是否存在匹配正則表達式模式的字符串
若是存在,返回true,不然返回false
給其加上g後,判斷ab是存在匹配該模式的字符, ,從結果看來,當執行到第三次,結果變成了false,實際上是lastIndex這個屬性在做用,緣由在於正則表達式執行了test方法後都會做用到正則表達式自己的結果。
,能夠看到執行兩次後,lastIndex的值變爲了2
分析:當前匹配結果,就是a,當前匹配結果的最後一個結果,仍是a,當前匹配結果的最後一個結果的下一個結果,那就是b,此時lastIndex的值就是1了。那麼在執行一次,lastIndex的結果就是2,看來test方法執行,其lastIndex並非每次都是從頭開始的,那麼第3次執行的時候,lastIndex就被重置爲0了。
若是測試的是reg1.test('a');那麼其返回的結果,只有奇數次是true。由於咱們用test的方法時候,只是爲了測試是否存在某個字符而已,所以就沒有必要加上g標誌了。
RegExp.prototype.exec(str)
使用正則表達式模式對字符串執行搜索,並更新全局RegExp對象的屬性以反應匹配結果
若是沒有匹配的文本則返回null,不然返回一個結果數組
-index 聲明匹配文本的第一個字符的位置
-input 存放被檢索的字符串String
非全局調用:
*調用非全局的RegExp對象的exec()時,返回數組
*第一個元素是與正則表達式相匹配的文本
*第二個元素是與RegExpObject的第一個子表達式相匹配的文本(若是有的話)
*第三個元素是與RegExp對象的第二個子表達式相匹配的文本(若是有的話,依次類推)
注意了:在非全局的狀況下,lastIndex根本就不生效
以上是非全局和全局調用的結果
字符串對象方法:
String.prototype.search(reg)
*search()方法用於檢索字符串中指定子字符串,或檢索與正則表達式相匹配的子字符串
*方法返回第一個匹配結果 index,查找不到返回-1
*search()方法不執行全局匹配,它將忽略標誌g,而且老是從字符串的開始進行檢索
‘a1b2c3’.search('1');返回1,會將其轉換成正則表達式 ‘a1b2c3’.search(/1/);返回1,若是傳入的參數不是正則,則會嘗試轉換成正則表達式
String.prototype.match(reg)
非全局調用:
若是regexp沒有標誌g,那麼match()方法就只能在字符串中執行一次匹配
若是沒有找到任何文本,將返回null
不然它將返回一個數組,其中存放了與它找到的匹配文本有關的信息
返回數據的第一個元素存放的是匹配文本,而其他的元素存放的是與正則表達式的子表達式(如分組)匹配的文本
除了常規的數組元素以外,返回的數組還含有2個對象屬性
-index 聲明匹配文本的起始字符在字符串中的位置
-input聲明對stringObject的引用
全局調用:
若是regexp具備標誌g,則match方法將執行全局搜索,找到字符串中全部匹配子字符串
*沒有找到任何匹配的子串,則返回null
*若是找到了一個或多個匹配子串,則返回一個數組
數組元素中存放的是字符串中全部匹配子串,並且也沒有index屬性或input屬性
以上是非全局和全局調用結果,非全局下,lastIndex不起做用,其ret中的a是分組的字符。在全局條件下ret的結果爲1a2,3c4
Sting.propotype.split(reg)
咱們常用split方法把字符串分割爲字符數組
'a1b2c3d4e5',split(/\d/);
String.prototype.replace()
'a1b1c1'.replace('1',2) -->‘a2b1c1’,並非指望
‘a1b1c1’.replace(/1/g,2)-->'a2b2c2'
三種參數:
replace(str,replaceStr);
replace(reg,replaceStr);
replace(reg,function); //處理更加複雜的替換結果
採用第三種,用function的返回值做爲替換結果,function會在每次匹配替換結果的時候執行四個參數
一、匹配字符串
二、正則表達式分組內容,沒有分組則沒有參數
三、匹配項在字符串中的index下標
四、原字符串
將'a1b2c3d4e5' ---> 'a2b3c4d5e6'
從上看到,兩次匹配的結果分別是 1b2 和 2d4,因爲分組後,只對group1和group3保留,去掉group2,所以1b2-->12 3d4-->34,最終替換的結果就是a12c34e5