說來慚愧,作前端快三年對於正則表達式的應用仍是很淺薄,你們都知道正則的速度基本上是最快的,但就是懶得去記那些語法和規則,此次項目中屢次用到了須要匹配替換的動做,終於下定決心去研究一下了。前端
對象字面量正則表達式
/pattern/attributes函數
正則對象由這兩部分構成pattern(匹配規則)+attributes(修飾符)學習
var reg = /\bis\b/
這樣就成功的實例化一個正則表達式對象,接着咱們去應用它spa
字符串的replace函數接受兩個參數,第一個參數能夠是字符串或者正則表達式,第二個參數是須要替換的字符串,這樣咱們就成功把小寫的’is‘替換成了大寫的’IS‘
好多同窗看那一串符號又開始頭暈了,別急,聽我慢慢道來prototype
咱們先來拆解這個正則表達式
首先開頭結尾的//是必須的,而後是兩個’b‘,表明着單詞的開頭或結尾,也就是單詞的分界處,最後中間的is是須要匹配的字符串。連起來意思就是匹配字符串中的is,而且先後必需要有分界,也就是說’isisisisis‘這裏的is不能替換成’ISISISISIS‘
好了,有同窗會問,爲何句子中的第二個’is‘沒有被替換,爲何咱們沒看到所謂的那個修飾符。咱們再改寫一下這個正則對象3d
發現多了一個修飾符g,表明全局(globle)搜索,這樣就能夠匹配字符串中的全部的’is‘code
構造函數對象
var reg = new RegExp(pattern,attributes)blog
var reg = new RegExp('\\bis\\b','g') === var reg = /\bis\b/g
這裏須要解釋下爲何一樣的匹配規則卻多了兩個\
那是由於在js語法中,\須要轉義,因此在這裏的構造函數參數中須要把\轉義
g--globe
這個在以前的例子中你們已經見識過了,就是全局搜索,默認匹配到第一個就會中止
i--ignore case
忽略大小寫,默認大小寫敏感
m--multiple lines
多行搜索
元字符
正則表達式有兩種基本字符類型組成--原義文本字符和元字符
原義文本字符:字母數字這種無需轉義的字符
元字符:在正則表達式中有特殊含義的非字母字符
* + ? $ ^ . | \ () {} []
字符類
咱們能夠用元字符[]來構造簡單的類
好比說:[abc]就把abc三個字母歸爲了一類,表達式能夠匹配這一類字符
字符類取反
使用元字符^表示不屬於建立的類中的字符
範圍類
若是要是利用字符類匹配26個英文字母難道要一一寫出來麼,哈哈哈,too young too simple
使用範圍類[a-z]匹配全部的26個英文字母,相加匹配條件就直接加在[]裏面。
好比說[a-zA-Z0-9]匹配大小寫的英文字母和0-9的數字
預約義類
看一個例子:匹配ab+數字+任意字符的字符串
在學習預約義類以前咱們的寫法是
ab[0-9][^/n/r]
如今咱們學習了預約義類以後就能夠這樣
ab\d.
邊界
這裏的單詞邊界在最先的例子中咱們已經見識過了,如今咱們對比一下b和B的區別
^和$的用法
須要注意的是^和$在正則中的位置
量詞
若是咱們須要匹配連續出現100次數字的字符串難道要寫100個\b
吧
偉大的js語言固然不會這麼傻了,這不引入了量詞的概念麼
這一次的例子咱們結合接下來的概念一塊兒理解
這個例子中咱們把0-9這九個數字先是用{3,6}來全局匹配,發現匹配出兩個NB
我來解釋一下,正則表達式默認是貪婪模式匹配,即在量詞範圍中取最大的那個來匹配,因此第一個纔會出現兩個NB,1-6匹配一個NB,7-9匹配一個NB。而第二個匹配範圍是{3,7},結果是NB89,由於最大值是7,因此1-7匹配成NB,而剩下的8,9達不到3個,因此沒有匹配成功
這個非貪婪模式和貪婪模式相反,即取最小值來匹配,用法是在量詞後面加?。
正確設置匹配模式對於處理複雜的正則是頗有益處的
如今有這樣的需求,匹配wensnb這個字符串出現三次,是否是有的同窗會說
wensnb{3}
這樣固然是錯啦,由於只會匹配b出現三次,這時候就須要分組的概念
()能夠起到分組的效果
或
用 | 表示或,下面的例子展現或在分組中的應用
()把nb和123分組,而且用|表示二者取其一
反向引用
利用$進行分組中的引用,分別把分組中的內容對應$1....$n
忽略引用
並非全部的分組咱們都但願引用,用?:來忽略引用
咱們把上個例子中的第二個引用忽略,因此引用個數由3變成2個,所以找不到$3
原來對應$3的24如今變成了$2,而$1不變
你們聽這個名字前瞻就知道必定有一個後顧和他對應,說的沒錯,只不過在js語法中的正則不支持後顧,因此咱們只關注前瞻就夠了
咱們先來定義「前」:
在正則表達式中匹配是由文本頭部到尾部(左到右),因此這個「前」表明的是文本的尾部
下面來定義前瞻:
正則表達式匹配到規則時再向前檢查是否符合斷言或者不符合斷言(也是正則)
正向和負向前瞻的區別就是匹配到正則以後是否符合斷言,符合斷言稱爲正向前瞻,不符合就是負向前瞻
下面來看一個例子
在這個正向前瞻中,匹配一個單詞字符(w不只表明單詞,還表明數字下劃線)而且前面的還要符合數字1-3這個斷言才行,所以咱們把w e n這三個字符匹配到了
屬性
在文章的開始咱們介紹了修飾符globle,ignoreCase,multilines 其實這個都是正則表達式的屬性,而且有兩個咱們沒有說lastIndex和source 這五個屬性都是隻讀,不能修改
方法
RegExp.prototype.test(str) //匹配傳入的字符串符不符合正則規則(true or false)
RegExp.prototype.exec(str)