攻破難啃的骨頭-正則表達式

不少Web開發人員在忽視正則表達式以後,還能夠順利的工做,但不少狀況下,一句正確的正則表達式,頗有可能省略半屏的代碼。javascript

 

 

正則表達式的解釋

在JavaScript中,與大多數其餘對象類型同樣,有兩種方法能夠建立正則表達式:經過正則表達式字面量,或者經過構造RegExp對象的實例。
例如,若是要建立一個通常的正則表達式,用於精確匹配字符創「test」,能夠使用正則字面量:java

var pattern=/test/;

正斜槓可能看着有些奇怪,可是正如字符創是用引號進行界定同樣,正則字面量是用正斜槓進行界定的。
或者,咱們能夠構造一個RegExp實例,將正則表達式做爲字符串傳入:web

var pattern=new RegExp("test");

在開發過程當中,若是正則是已知的,則優先選擇字面量語法,而構造器方式則是用於在運行時,經過動態構建字符串來構建正則表達式。字面量語法優先於字符串的其中一個緣由是反斜槓字符在普通字符串中也是一個轉義字符,多以,咱們要用\\來表示反斜槓。
除了表達式自己,還有三個標誌能夠與正則進行關聯:正則表達式

  • i:讓正則表達式不區分大小寫。優化

  • g:匹配模式中的全部實例,而不是默認只匹配第一次出現的結果。ui

  • m:容許匹配多個行。spa

這些標誌將附加到字面量尾部(/test/ig)或者做爲RegExp的第二個字符參數。code

術語與操做符

匹配一類字符

  • [abc]:匹配a,b,c中的任何一個字符。regexp

  • [^abc]:匹配除a,b,c之外的任意字符。對象

  • [a-m]:匹配從a到m的全部字符。

釋義

  • /^test/:以test開頭的字符串

  • /test$/:表示該模式必須出如今字符串的結尾

重複出現

  • /t?est/:該字符t可出現0次或1次

  • /t+est/:該字符t可出現1次或屢次

  • /t*est/:該字符t可出現0次或屢次

  • /a{4}/:該字符出現4次

  • /a{4,10}/:包含連續4個至10個a字符的字符串
    這些重複操做符能夠是貪婪的也能夠是非貪婪的,默認爲貪婪的:匹配全部字符組合。在操做符後邊加一個問號?字符,如a+?,可讓該表達式成爲非貪婪的:進行最小限度的匹配

預約義字符類

預約義術語 匹配內容
\t 水平製表符
\b 空格
\v 垂直製表符
\f 換頁符
\r 回車
\n 換行符
. 匹配除了新行以外的任意字符
\d 匹配任意數字,等價於[0~9]
\D 匹配任意非數字,訂價與[^0~9]
\w 匹配包括下劃線的任意單詞字符,等價於[A-Za-z0-9_]
\W 匹配任意非單詞字符,等價於[^A-Za-z0-9_]
\s 匹配任何空白字符,包括空格製表符換頁符
\S 匹配任意非空白字符
\b 匹配單詞邊界
\B 匹配非單詞邊界

分組

若是將操做符應用於一組術語,能夠像數學表達式同樣在改組上使用小括號。例如:/(ab)+/匹配一個或多個連續出現的子字符串「ab」

或操做符

能夠用|字符表示或者的關係。例如/(ab)+|(cd)+/匹配出現一次或屢次的「ab」或「cd」。

反向引用

這種術語表示法是在反斜槓後面加一個要引用的捕獲數量,該數字從1開始,如\一、\2等。
例如:/^([dtn])a\1/匹配任意一個以d,t或者n開頭,且後邊跟着一個a字符,而且再後邊跟着的是和第一個捕獲相同字符的字符串。所以\1匹配的字符須要在執行的時候才能肯定。
在匹配XML類型的標記元素的時候它頗有用,例如/<(\w+)>(.+)</\1>/,能夠匹配像「<strong>shtat</strong>」這樣的元素。

編譯正則表達式

正則表達式的兩個重要階段是編譯和執行,編譯發生在正則表達式第一次被建立時,而執行發生在咱們使用編譯過的正則表達式進行字符串匹配的時候。
正則表達式只建立一次,並將其保存在一個變量中供後續使用,這是一個重要的優化過程。

捕獲匹配的片斷

簡單匹配一個字符創是否匹配一個模式顯然是咱們須要作的第一步,但在不少狀況下,肯定匹配的內容也是頗有用的。

(未完待續)

相關文章
相關標籤/搜索