JavaScript定義正則表達式有兩種方法。正則表達式
1.RegExp構造函數app
var pattern = new RegExp("[bc]at","i");
它接收兩個參數:一個是要匹配的字符串模式,另外一個是可選的標誌字符串。函數
2.字面量spa
var pattern = /[bc]at/i;
正則表達式的匹配模式支持三種標誌字符串:3d
這兩種建立正則表達式方法的不一樣之處在於,正則表達式字面量始終會共享同一個RegExp實例,而使用構造函數建立的每個新RegExp實例都是新實例。blog
元字符是擁有特殊意義的字符,正則表達式的元字符主要有:ip
( [ { \ ^ $ | ) ? * + . 字符串
在不一樣的組合中元字符有其不一樣的意義。table
通常狀況下正則表達式一個字符對應字符串一個字符,但咱們可使用[]來構建一個簡單的類,來表示符合某一特徵的一類字符。例如:class
[abc]能夠匹配方括號中的a、b、c或其任意組合的字符。
既然[]能夠構建一個類,那麼天然就會聯想到與之對應的不包含括號中內容的類,這個類叫作反向類,例如[^abc]就能夠匹配不是a或b或c的字符。
有時候一個一個字符匹配太麻煩並且匹配的類型也相同,此時咱們可使用"-"鏈接線來表示某個閉區間之間的內容,例如匹配全部小寫字母可使用[a-z],以下:
匹配全部的0到9簡直的任意數字可使用[0-9]表示:
對於如上咱們建立的幾個類,正則表達式爲咱們提供了幾個經常使用的預約義類來匹配常見的字符,以下:
字符 | 等價類 | 含義 |
. | [^\n\r] | 匹配除了回車符和換行符以外的全部字符 |
\d | [0-9] | 數字字符 |
\D | [^0-9] | 非數字字符 |
\s | [\t\n\x0B\f\r] | 空白字符 |
\S | [^\t\n\x0B\f\r] | 非空白字符 |
\w | [a-zA-Z_0-9] | 單詞字符(字母、數字和下劃線) |
\W | [^a-zA-Z_0-9] | 非單詞字符 |
上面的方法匹配字符都是一對一匹配的,若是某個字符連續出現屢次按照上面的方法匹配會很是麻煩,所以咱們想有沒有其它方法能夠直接匹配屢次重複出現的字符。正則表達式爲咱們提供了一些量詞,以下:
字符 | 含義 |
? | 出現零次或一次(最多一次) |
+ | 出現一次或屢次(至少一次) |
* | 出現零次或屢次(任意次) |
{n} | 出現n次 |
{n,m} | 出現n到m次 |
{n,} | 至少出現n次 |
對於{n,m}這種匹配方式,究竟是匹配n個仍是匹配m個呢?這就涉及到匹配模式的問題。默認狀況下,量詞是儘量多的匹配字符,也就是所謂的貪婪模式,例如:
var num = '123456789'; num.match(/\d{2,4}/g); //[1234]、[5678]、[9]
與貪婪模式對於的是非貪婪模式,只須要在量詞以後加"?"便可,例如{n,m}?,就是按照最少的字符匹配,以下:
var num = '123456789'; num.match(/\d{2,4}?/g); //[12]、[34]、[56]、[78]、[9]
量詞只能是單個字符匹配屢次,若是咱們但願匹配某一組字符屢次呢?正則表達式中小括號能夠定義一個字符串總體爲一個分組。
咱們想要匹配apple這個單詞出現4次能夠這樣匹配(apple){4},以下:
若是想要匹配apple或orange出現4次,能夠插入管道符"|",例如:
(apple|orange){4}
若是使用分組的正則表達式中出現多個小括號即多個分組,那麼匹配結果就會把匹配項也分組並編號,例如:
(apple)\d+(orange)
若是咱們不但願捕獲某些分組,只須要在分組的小括號前面緊跟一個問號和冒號便可,例如:
(?:apple)\d+(orange)
正則表達式也爲咱們提供了幾個經常使用的邊界匹配字符,例如:
字符 | 含義 |
^ | 以xx開頭 |
$ | 以xx結尾 |
\b | 單詞邊界,指[a-zA-Z_0-9]以外的字符 |
\B | 非單詞邊界 |
其中單詞邊界匹配的是一個位置,這個位置的一側是構成單詞的字符,但另外一側爲非單詞字符、字符串的開始或結束位置。
前瞻用來匹配接下來出現的是或不是某一個特定的字符集。
表達式 | 含義 |
exp1(?=exp2) | 匹配後面是exp2的exp1 |
exp1(?!exp2) | 匹配後面不是exp2的exp1 |
看一個例子:
apple(?=orange)
(/apple(?=orange)/).test('appleorange123'); //true (/apple(?=orange)/).test('applepear345'); //false
再看另外一個例子:
apple(?!orange)
(/apple(?!orange)/).test('appleorange123'); //false (/apple(?!orange)/).test('applepear345'); //true