js正則表達式學習筆記

說來慚愧,作前端快三年對於正則表達式的應用仍是很淺薄,你們都知道正則的速度基本上是最快的,但就是懶得去記那些語法和規則,此次項目中屢次用到了須要匹配替換的動做,終於下定決心去研究一下了。前端

實例化正則對象

  • 對象字面量正則表達式

/pattern/attributes函數

正則對象由這兩部分構成pattern(匹配規則)+attributes(修飾符)學習

var reg = /\bis\b/

這樣就成功的實例化一個正則表達式對象,接着咱們去應用它spa

clipboard.png

字符串的replace函數接受兩個參數,第一個參數能夠是字符串或者正則表達式,第二個參數是須要替換的字符串,這樣咱們就成功把小寫的’is‘替換成了大寫的’IS‘
好多同窗看那一串符號又開始頭暈了,別急,聽我慢慢道來prototype

咱們先來拆解這個正則表達式
首先開頭結尾的//是必須的,而後是兩個’b‘,表明着單詞的開頭或結尾,也就是單詞的分界處,最後中間的is是須要匹配的字符串。連起來意思就是匹配字符串中的is,而且先後必需要有分界,也就是說’isisisisis‘這裏的is不能替換成’ISISISISIS‘
好了,有同窗會問,爲何句子中的第二個’is‘沒有被替換,爲何咱們沒看到所謂的那個修飾符。咱們再改寫一下這個正則對象3d

clipboard.png

發現多了一個修飾符g,表明全局(globle)搜索,這樣就能夠匹配字符串中的全部的’is‘code

  • 構造函數對象

var reg = new RegExp(pattern,attributes)blog

var reg = new RegExp('\\bis\\b','g') === var reg = /\bis\b/g

這裏須要解釋下爲何一樣的匹配規則卻多了兩個\
那是由於在js語法中,\須要轉義,因此在這裏的構造函數參數中須要把\轉義

clipboard.png

修飾符

  • g--globe

這個在以前的例子中你們已經見識過了,就是全局搜索,默認匹配到第一個就會中止

  • i--ignore case

忽略大小寫,默認大小寫敏感

clipboard.png

  • m--multiple lines

多行搜索

各類規則

  • 元字符

正則表達式有兩種基本字符類型組成--原義文本字符和元字符
原義文本字符:字母數字這種無需轉義的字符
元字符:在正則表達式中有特殊含義的非字母字符

* + ? $ ^ . | \ () {} []
  • 字符類

咱們能夠用元字符[]來構造簡單的類
好比說:[abc]就把abc三個字母歸爲了一類,表達式能夠匹配這一類字符

clipboard.png

  • 字符類取反

使用元字符^表示不屬於建立的類中的字符

clipboard.png

  • 範圍類

若是要是利用字符類匹配26個英文字母難道要一一寫出來麼,哈哈哈,too young too simple
使用範圍類[a-z]匹配全部的26個英文字母,相加匹配條件就直接加在[]裏面。
好比說[a-zA-Z0-9]匹配大小寫的英文字母和0-9的數字

clipboard.png

  • 預約義類

clipboard.png

看一個例子:匹配ab+數字+任意字符的字符串

在學習預約義類以前咱們的寫法是

ab[0-9][^/n/r]

如今咱們學習了預約義類以後就能夠這樣

ab\d.
  • 邊界

clipboard.png

這裏的單詞邊界在最先的例子中咱們已經見識過了,如今咱們對比一下b和B的區別

clipboard.png

^和$的用法

clipboard.png

須要注意的是^和$在正則中的位置

  • 量詞

若是咱們須要匹配連續出現100次數字的字符串難道要寫100個\b
偉大的js語言固然不會這麼傻了,這不引入了量詞的概念麼

clipboard.png

這一次的例子咱們結合接下來的概念一塊兒理解

貪婪模式與非貪婪模式

clipboard.png

這個例子中咱們把0-9這九個數字先是用{3,6}來全局匹配,發現匹配出兩個NB
我來解釋一下,正則表達式默認是貪婪模式匹配,即在量詞範圍中取最大的那個來匹配,因此第一個纔會出現兩個NB,1-6匹配一個NB,7-9匹配一個NB。而第二個匹配範圍是{3,7},結果是NB89,由於最大值是7,因此1-7匹配成NB,而剩下的8,9達不到3個,因此沒有匹配成功

clipboard.png

這個非貪婪模式和貪婪模式相反,即取最小值來匹配,用法是在量詞後面加?。
正確設置匹配模式對於處理複雜的正則是頗有益處的

分組

如今有這樣的需求,匹配wensnb這個字符串出現三次,是否是有的同窗會說

wensnb{3}

這樣固然是錯啦,由於只會匹配b出現三次,這時候就須要分組的概念

()能夠起到分組的效果

clipboard.png

用 | 表示或,下面的例子展現或在分組中的應用

clipboard.png

()把nb和123分組,而且用|表示二者取其一

  • 反向引用

利用$進行分組中的引用,分別把分組中的內容對應$1....$n

clipboard.png

  • 忽略引用

並非全部的分組咱們都但願引用,用?:來忽略引用

clipboard.png

咱們把上個例子中的第二個引用忽略,因此引用個數由3變成2個,所以找不到$3
原來對應$3的24如今變成了$2,而$1不變

前瞻

你們聽這個名字前瞻就知道必定有一個後顧和他對應,說的沒錯,只不過在js語法中的正則不支持後顧,因此咱們只關注前瞻就夠了

咱們先來定義「前」:

在正則表達式中匹配是由文本頭部到尾部(左到右),因此這個「前」表明的是文本的尾部

下面來定義前瞻:

正則表達式匹配到規則時再向前檢查是否符合斷言或者不符合斷言(也是正則)

clipboard.png

正向和負向前瞻的區別就是匹配到正則以後是否符合斷言,符合斷言稱爲正向前瞻,不符合就是負向前瞻

下面來看一個例子

clipboard.png

在這個正向前瞻中,匹配一個單詞字符(w不只表明單詞,還表明數字下劃線)而且前面的還要符合數字1-3這個斷言才行,所以咱們把w e n這三個字符匹配到了

正則表達式的屬性和方法

  1. 屬性

    clipboard.png

在文章的開始咱們介紹了修飾符globle,ignoreCase,multilines
其實這個都是正則表達式的屬性,而且有兩個咱們沒有說lastIndex和source
這五個屬性都是隻讀,不能修改

clipboard.png

clipboard.png

  1. 方法

RegExp.prototype.test(str) //匹配傳入的字符串符不符合正則規則(true or false)

clipboard.png

RegExp.prototype.exec(str)

相關文章
相關標籤/搜索