三分鐘搞懂正則之捕獲

正則基礎知識

元字符

若是把正則看作一門語言,那麼元字符就是其最基本的語法,只有熟練掌握了元字符,才能敲開正則的大門。熟悉的同窗能夠跳過這一部分。
經常使用的元字符有一下這些:正則表達式

  • 表示位置的:^ &,分別表示開頭和結尾
  • 表示字符的:\w,也即[a-zA-Z0-9_]
  • 表示數字的:\d,也即[0-9]
  • 表示邊界的:\b,要注意的是它僅對數字和英文字母有效,好比/a\b/ 匹配 'ba'中的a
  • 表示空白符:\s
  • 表示數量的:能夠用通配符,也能夠用{n,m}的形式。好比*和{0,}, ?和{0,1} , +和{1,}

還有一種特殊的元字符,叫字符集
[],[^ ]分別表明正向字符集和反向字符集,分別表示匹配(不匹配)其中任意一個字符。反向字符集中的^必須在開頭哦。
另外要注意的是,元字符在字符集中不必定是元字符,好比\b,另外,字符集中也有元字符-,表示範圍鏈接。[a-b]沒法匹配'-'哦。
字符集裏面還能夠表示unicode字符,好比常見的漢字的正則表達式\u4e00-\u9fa5,這個範圍就表明unicode字符集中CJK統一表意符中的一部分,String.fromCharCode(parseInt('4e00',16))能夠獲得'一'數組

捕獲

首先咱們來看下面這張圖片,加不加()對結果有何影響。
clipboard.pngspa

咱們能夠看到,沒有括號,返回的結果裏就少了一個東西。那麼返回的數組的第二位表示啥呢?咱們能夠參閱MDN中的解釋。翻譯

clipboard.png

翻譯成白話,就是數組中的第一個值表示匹配中的字符串,第二個日後,就是捕獲到的匹配項。也就是說我加了(),正則就能夠捕獲到其中的匹配項。input,index很好理解,那groups有事啥呢?爲啥一直沒見過它裏面有值。
好的,咱們再來看下一張圖code

clipboard.png

這個正則的寫法叫命名捕獲組,它捕獲的內容就會在groups中也存一份。對象

那麼如何理解捕獲呢?咱們只要理解主語,賓語,如何獲取,捕獲順序就好了。
主語天然是正則,賓語就是括號中的匹配項。
正則捕獲後咱們可使用RegExp.$1獲取捕獲的第一個內容,$2表示捕獲的第二個內容,以此類推,也能夠從match,exec等js方法返回值中獲取
那麼捕獲順序如何肯定呢,咱們能夠再看下一張圖:blog

clipboard.png

很顯然,它是從外往內,從左往右的一個順序捕獲的。圖片

既然有捕獲,那也必定有非捕獲。()還有一種功能就是將其中的多個匹配項當作一個總體。那麼若是我只想捕獲這個總體中的一部分呢?ip

clipboard.png

一圖勝千言,當咱們不須要捕獲時,就可使用(?: )這種寫法了。unicode

以上就是捕獲的基本用法,不過還有個具名捕獲組須要掌握。

  • 命名:?<name>
  • 獲取:除了用groups對象,咱們還能夠在replace方法中使用$<name>獲取

clipboard.png

  • 另外還須要掌握它的反向引用:\k<name>

clipboard.png

那麼反向引用是什麼意思呢?咱們下一期再繼續。

相關文章
相關標籤/搜索