正則表達式是由普通字符(例如數字、字母、標點和用來表示特定字符或字符集的元字符)以及特殊字符(用做限定條件或特殊功能的字符)組成的文字模式。javascript
全部數字、小寫字母、大寫字母、標點都屬於普通字符。java
而爲了匹配除以上列出的字符集之外的字符,或者匹配特定範圍內的任意字符,須要使用元字符。元字符分直接量字符和字符類。正則表達式
字符 | 描述 |
---|---|
uXXXX | 由16進制數XXXX指定的unicode字符 |
xNN | 由16進制數NN指定的拉丁字符 |
o | NUL字符(u0000) |
t | 製表符(u0009) |
n | 換行符(u000A) |
v | 垂直製表符(u000B) |
f | 換頁符(u000C) |
r | 回車符(u000D) |
字符類元字符用來匹配特定範圍內的字符。一個字符類能夠匹配它所包含的任意字符。數組
字符 | 描述 |
---|---|
. | 除了換行和行結束符以外的全部單個字符 |
w | 等價於[0-9a-zA-Z] |
W | 除了w之外的全部字符 |
s | 任何Unicode空白符 |
S | 任何非Unicode空白符的字符(範圍比w大) |
d | 等價於[0-9] |
D | 除了d之外的全部字符 |
[...] | 方括號內的任意字符 |
1 | 除了方括號內字符集的任意字符 |
當須要匹配多個指定的字符時,須要用到一些專門的特殊字符來表示重複匹配的次數。函數
字符 | 描述 |
---|---|
{n,m} | 匹配至少n次,但不能超過m次 |
{n,} | 匹配至少n次,無上限 |
{n} | 匹配n次 |
? | 匹配0次或1次,等價於{0,1} |
+ | 匹配1次或屢次,無上限,等價於{1,} |
* | 匹配0次或屢次,無上限,等價於{0,} |
重複字符須要與普通字符配合使用,如[a-z]{3,5},即匹配3個到5個小寫字母。code
當須要匹配以指定字符開頭或結尾的字符串時,須要用到錨字符。ip
字符 | 描述 |
---|---|
^ | 匹配字符串的開頭,在多行檢索中,匹配一行的開頭 |
$ | 匹配字符串的結尾,在多行檢索中,匹配一行的結尾 |
(?=p) | 零寬正向先行斷言,要求接下來的字符都與p匹配,匹配結果不包含p |
(?!p) | 零寬負向先行斷言,要求接下來的字符不能和p匹配 |
b | 匹配一個字邊界(須要和其餘表達式配合使用,單獨使用[b]表示退格符) |
B | 匹配一個非字邊界 |
例:須要匹配以字母、下劃線或$開頭的字符串來校驗變量名是否合法,可使用/^[a-zA-Z_$].*/unicode
注:^在方括號[]內部表示反向匹配。字符串
零寬先行斷言能夠將任何正則表達式都作爲結尾錨點,q(?=p)表示匹配全部以p結尾的q字符串,匹配結果僅包含q部分,不包含錨點p。input
例:匹配以」.」結尾的字符串,可使用/w+(?=.)/g
則匹配'a.b.c.d.e.f'的結果爲['a','b','c','d','e']。f後沒有.,因此不被匹配。
q(?!p)表示匹配全部不以p結尾的q字符串。
注:javascript不支持後行斷言,即不能將正則表達式做爲開始錨點。
b能夠用來匹配一個單詞的開頭或結尾。例:匹配String中的Str用/bStr/,匹配String中的ing用/ingb/
B可用來匹配一個單詞的中間部分。例:匹配String中的trin用/BtrinB/
字符 | 描述 |
---|---|
| | 選擇匹配,「|」左邊的表達式和右邊的表達式皆可匹配 |
(...) | 分組匹配,將幾個項組合爲一個單元,這個單元能夠用"*","+","?","|","{n,m}"等符號加以修飾。並且能夠記住和這個組合相匹配的字符。 |
(?:...) | 非捕獲性分組,只負責匹配,不記憶與該組相匹配的字符 |
(?:...)和(...)的差別僅僅存在與匹配結果,當須要記錄某一部分匹配項時,用(...)。若只是用來匹配,後續不須要使用分組匹配到的字符串,則用(?:...)
字符 | 描述 |
---|---|
\ |
RegExp實例化有兩張方式。一種經過字面量實例化,一種經過new RegExp()構造函數實例化
var exp = / pattern / flags; //RegExp字面量 var exp = new RegExp("pattern","flags"); //RegExp構造函數
flags用來表示正則表達式的行爲。可選項有g,i,m三個標識,可同時定義一個或多個標識。
g:global,表示全局模式。flags中包含g時,表達式匹配全部可以匹配上的字符串;若是沒包含g時,則當匹配到第一個字符串時,即中止匹配。
i:case-insentive,表示忽略大小寫。flags中包含i時,表達式匹配時忽略字符串的大小寫。
m:multi-line,表示多行匹配。flags中包含m時,表達式匹配到一行文本末尾時還會繼續查找下一行中是否存在匹配項。
pattern即正則表達式語句。
RegExp構造函數優點在於能夠動態傳入正則表達式。
boolean值,表示是否設置了g標誌。
boolean值,表示是否設置了i標誌。
boolean值,表示是否設置了m標誌。
正則表達式的字符串表示,按照字面量形式而非傳入構造函數中的字符串模式返回。
整數,表示開始搜索下一個匹配項的字符位置,從0 算起。
例:
var exp = /\[bc\]at/gi; exp.global;//true exp.ignoreCase;//true exp.multiline;//false exp.source;//「\[bc\]at」
exec方法接受一個參數,即須要應用模式的字符串,而後返回包含第一個匹配項信息的數組,或者在沒有匹配項時返回null。返回的數組是Array實例,但還包含額外兩個屬性:index和input。
一句句解釋。
返回包含第一個匹配項信息的數組,或者在沒有匹配項時返回null:
這裏分兩種狀況,一種是global匹配,一種是非global匹配。
global模式執行exec()匹配成功一次之後,再次執行exec()時,會從前一次匹配的最後一位開始繼續向後匹配。例:
var exp = /.at/g var matches = exp.exec('cat, bat, sat, fat'); //第一次匹配 matches.index => 0 matches.input => 'cat, bat, sat, fat' matches => ['cat'] exp.lastIndex => 3 matches = exp.exec('cat, bat, sat, fat'); //第二次匹配 matches.index => 5 matches.input => 'cat, bat, sat, fat' matches => ['bat'] exp.lastIndex => 8 ...
非global模式執行exec()匹配成功一次之後,再次執行exec()時,會從頭開始從新匹配。
var exp = /.at/ var matches = exp.exec('cat, bat, sat, fat'); //第一次匹配 matches.index => 0 matches.input => 'cat, bat, sat, fat' matches => ['cat'] exp.lastIndex => 0 matches = exp.exec('cat, bat, sat, fat'); //第二次匹配 matches.index => 0 matches.input => 'cat, bat, sat, fat' matches => ['cat'] exp.lastIndex => 0
返回的數組是Array實例:
當使用(...)分組匹配時,一次exec()會匹配到多個結果
var exp = /(there)\s+(you)\s+(are)/; var matches = exp.exec('hey, there you are my dear'); matches = ["there you are", "there", "you", "are"];
matches[0]匹配整個表達式字符串。
matches[1]匹配第一個(...)內的字符串,以後以此類推。
補充說明:含(?:...)非捕獲分組的表達式執行exec後返回的數組中不包含(?:...)匹配的字符串。非捕獲性分組(?:...)和捕獲性分組(...)的區別就在這裏。
屬性index和input:
index表示匹配項在字符串中的起始位置。
input表示應用正則表達式的字符串。
test方法接受一個參數做爲須要應用模式的字符串,在模式與該參數匹配的狀況下返回true,不然返回false。在只想知道目標字符串與某個模式是否匹配,但不須要知道其文本內容的狀況下,使用這個方法很是方便。所以,test()方法常常被用在if 語句中。
string有四個方法能夠將正則表達式做爲參數傳入。
str.search(exp)返回str中第一個與exp表達式匹配的字符串的起始位置。若是找不到匹配項,返回-1。若是search傳入的參數是一個string,則首先會經過RegExp構造函數將其轉換爲正則表達式。search不支持全局搜索,它會忽略global標識。
'JavaScript'.search(/script/i) => 4
str.replace(exp, replaceStr)第一個參數是一個正則表達式,第二個參數是要替換成的字符串。若是exp帶有global標識,那麼源字符str中全部與exp表達式匹配的子串都會被替換。若是不帶g,str中僅第一個與exp匹配的子串會被替換。
text.replace(/javascript/gi, 'JS') //將text全文中全部javascript改成JS
replaceStr中若是出現$加數字N的字符串,表示第N個子表達式相匹配的文本。
text.replace(/'([^']*)'/g, '"$1"') //將text全文中全部被''引用的子串替換成被""引用。
str.match(exp)返回一個由匹配結果組成的數組。
該數組不一樣於RegExp實例方法exex()返回的數組。當有global標識時,match返回全局匹配到的全部字符串組成的數組;當沒有global標識時,match就返回第一個匹配到的字符串組成的單元素數組。
'11+2=13'.match(/\d/g) => ['1','1','2','1','3'] '11+2=13'.match(/\d/) => ['1']
match方法不會返回捕獲性組合匹配到的子串,(...)分組匹配在match方法中不會像RegExp實例方法exec()同樣返回匹配的子串。
當split方法傳入的參數爲正則表達式時,這使得split()方法異常強大。例如,能夠指定分隔符,容許兩邊能夠留有任意多的空白符:
'1 , ,2 , 3 , 4 , 5'.split(/\s*,\s*/) => ['1','2','3','4','5']