一、正則表達式簡介
- 是什麼?
- 正則表達式(Regular Expression)是一種文本模式,包括普通字符(如,字母(分大小寫)、數字)和特殊符號(稱爲’元字符’)。
- 能幹什麼?
- 使用單個字符串來描述和匹配一系列某個句法規則的字符串。
二、語法
-
? 通配符匹配0個或1個字符
-
* 通配符匹配任意個字符
-
^ 匹配輸入字符串的開始位置
-
[0-9] 匹配單個數字,[0-9]+匹配多個數字,+表示前面的字符必須出現一次或多次
-
abc$ 匹配以abc字母結尾的字符串,$爲匹配輸入字符串的結束位置
-
{0, m} 匹配0-m個字符
-
舉個列子(圖片來自菜鳥教程):
-
非打印字符
字 符 | 描述 |
---|---|
\cx | 匹配由x指明的控制字符。例如, \cM 匹配一個 Control-M 或回車符。x 的值必須爲 A-Z 或 a-z 之一。否則,將 c 視爲一個原義的 ‘c’ 字符 |
\f | 匹配一個換頁符號 |
\n | 匹配一個換行符 |
\r | 匹配一個回車符 |
\s | 匹配一個空白字符,包括空格、製表符 |
\S | 匹配任何非空白字符 |
\t | 匹配一個製表符 |
\v | 匹配一個垂直製表符 |
- 特殊字符(要匹配特殊字符本身都在前面加 \)
特殊字符 | 描述 |
---|---|
$ | 匹配輸入字符串的結尾位置。如果設置了RegExp對象的Multuline屬性,則$也匹配\n或\r |
() | 標記一個子表示的開始和結束位置。子表示可以獲取供以後使用 |
* | 匹配前面的子表達式0次或者多次 |
+ | 匹配前面的子表達式1次或者多次 |
. | 匹配除換行符\n 之外的任何單字符 |
[ | 標記一箇中括號表達式的開始 |
? | 匹配前面的子表達式0次或者1,或指明一個非貪婪限定符 |
\ | 將下一個字符標記爲特殊字符、或原意字符、或八進制轉義符。例如, ‘n’ 匹配字符 ‘n’。’\n’ 匹配換行符。序列 ‘\’ 匹配 “”,而 ‘(’ 則匹配 “(”。 |
^ | 匹配輸入字符串的開始位置。除非在[]中使用,此時它表示不接受該字符集合。 |
{ | 標記限定符表達式的開始。如,限制 字符串/一個表達式 的個數 |
| | 指明兩項之間的一個選擇 |
補充:. 特殊字符在中括號表達式時 如 [.] 只會匹配 .字符,等價於 .,而非匹配除換行符 \n 外的所有字符。
[^指定字符串] 指的是除指定字符串以外的其他字符串。
(^[0-9])+ // 匹配有一至多個數字的字符串組合
[^[0-9]]+ // 匹配有一至多個不含數字的字符串組合
- 限定符
限定符用來指定正則表達式的一個給定組件必須要出現多少次才能滿足匹配。
字符 | 描述 |
---|---|
* | 匹配前面的子表達式0次或多次。如zo*能匹配"z"以及"zoo", 等價於{0, } |
+ | 匹配前面的子表達式1次或多次。如,“zo+“能匹配"zo"以及"zoo”,不能匹配"z”, 等價於{1, } |
? | 匹配前面的子表達式0次或一次。如,"do(es)?“可以匹配"do”、“does”、“doxy”, 等價於{0, 1} |
{n} | n 是非負整數。匹配確定的n次。如,"0{2}“不能匹配"bob"中的’o’, 能匹配"food"中的兩個"o” |
{n, } | n是非負整數。至少匹配n 次。‘o{1,}’ 等價於 ‘o+’。‘o{0,}’ 則等價於 ‘o*’。 |
{n, m} | m 和 n均爲非負整數, 且n<=m。最少匹配n次最多匹配m次。"o{0,1}“等價於"o?”。注意在逗號和兩個數之間不能有空格 |
注意: *、+限定符都是貪婪的,因爲它們會儘可能多的匹配文字,只有在它們的後面加上一個?就可以實現非貪婪或最小匹配。
-
舉個列子
目標字符串:<H1>Chapter 1 - 介紹正則表達式</H1> -
貪婪模式:
- /<.*>/表達式匹配從開始小於符號 (<) 到關閉 H1 標記的大於符號 (>) 之間的所有內容。
即,匹配的內容爲:<H1>Chapter 1 - 介紹正則表達式</H1>
- /<.*>/表達式匹配從開始小於符號 (<) 到關閉 H1 標記的大於符號 (>) 之間的所有內容。
-
非貪婪模式:
- /<.*?>/表達式只匹配開始和結束 H1 標籤。即,非貪婪表達式只匹配<H1>。
- 如果只想匹配開始的 H1 標籤,表達式則是:/<\w+?>/
補充:通過在 *、+ 或 ? 限定符之後放置 ?,該表達式從"貪心"表達式轉換爲"非貪心"表達式或者最小匹配。
- 定位符
定位符使您能夠將正則表達式固定到行首或行尾。
字符 | 描述 |
---|---|
^ | 匹配輸入字符串開始的位置。如果RegExp設置了multiline屬性,^ 還會與’\n’,’\r’之後的位置匹配 |
$ | 匹配輸入字符串結尾的位置。如果RegExp設置了multiline屬性,$還會與’\n’,’\r’之前的位置匹配 |
\b | 匹配一個單詞的邊界,即字與空格之間的位置。如,’/\bCha/'匹配Chapter 的開頭三個字符,因爲這三個字符出現在單詞邊界後面 |
\B | 非單詞邊界匹配。如,’/\Bapt/'匹配Chapter 中的字符串 apt,但不匹配 aptitude 中的字符串 apt |
- 選擇
用圓括號將選項括起來,相鄰的選擇項之間用|分隔。但圓括號會有一個副作用,使相關的匹配會被緩存,此時可用 ?:放在第一個選項前來消除這個副作用
注意: 不能將限定符與定位符一起使用。由於在緊靠換行或者單詞邊界的前面或後面不能有一個以上位置,因此不允許諸如 ^* 之類的表達式
補充:
其中?:是非捕獲員之一,還有兩個非捕獲元是?=和?!?=表示正向預查,在任何開始匹配圓括號內的正則表達式模式的位置來匹配搜索字符串
?! 表示負向預查,在任何開始不匹配正則表達式模式的位置來匹配搜索字符串
-
反向引用
-
對一個正則表達式兩邊添加圓括號將導致相關匹配存儲到一個臨時緩衝區中,所捕獲的每個子匹配都按照在正則表達式模式中從左到右出現的順序存儲。緩衝區編號從1開始,最多存儲99個捕獲的子表達式。每個緩衝區都可以使用 \n 訪問,其中n爲一個標識特定緩衝區的編號(1=<n<=99)
-
可以使用非捕獲元字符 ?: 、?= 、 ?! 來重寫捕獲,忽略相關匹配的保存
例子一: // 查找重複的單詞 var str = "Is is the cost of of gasoline going up up"; var patt1 = /\b([a-z]+) \1\b/ig; document.write(str.match(patt1)); // 結果:Is is,of of,up up
解釋:
[a-z]+ 匹配一個或多個字母。
正則表達式的第二部分是對以前捕獲的子匹配項的引用,即,單詞的第二個匹配項正好由括號表達式匹配。
\1 指定第一個子匹配項。
單詞邊界元字符確保只檢測整個單詞。否則,諸如 “is issued” 或 “this is” 之類的詞組將不能正確地被此表達式識別。
正則表達式後面的全局標記 g 指定將該表達式應用到輸入字符串中能夠查找到的儘可能多的匹配。
表達式的結尾處的不區分大小寫 i 標記指定不區分大小寫。
多行標記指定換行符的兩邊可能出現潛在的匹配。例子二: // 將通用資源指示符 (URI) 分解爲其組件。假定您想將下面的 URI 分解爲協議(ftp、http 等等)、域地址和頁/路徑 var str = "http://www.runoob.com:80/html/html-tutorial.html"; var patt1 = /(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/; arr = str.match(patt1); for (var i = 0; i < arr.length ; i++) { document.write(arr[i]); document.write("<br>"); } // 結果 : http://www.runoob.com:80/html/html-tutorial.html http www.runoob.com :80 /html/html-tutorial.html
解釋:
str.match(patt1) 返回一個數組,實例中的數組包含 5 個元素,索引 0 對應的是整個字符串,索引 1 對應第一個匹配符(括號內),以此類推。
第一個括號子表達式捕獲 Web 地址的協議部分。該子表達式匹配在冒號和兩個正斜槓前面的任何單詞。
第二個括號子表達式捕獲地址的域地址部分。子表達式匹配 : 和 / 之後的一個或多個字符。
第三個括號子表達式捕獲端口號(如果指定了的話)。該子表達式匹配冒號後面的零個或多個數字。只能重複一次該子表達式。
第四個括號子表達式捕獲 Web 地址指定的路徑和 / 或頁信息。該子表達式能匹配不包括 # 或空格字符的任何字符序列。 -