正則表達式的2種定義方法:一種是直接調用RegExp(),第二種是直接用字面量來定義,即var re = /正則規則/;javascript
2種定義方法本質都是調用RegExp()方法java
在調用同一段正則代碼的時候,ECMAScript3和ECMAScript5中表現徹底不同正則表達式
function reg(){ var re = /\sjavascript/; return re; }
分別在ECMAScript3和ECMAScript5中調用reg()方法屢次spa
在ECMAScript3中,調用的是同一個RegExp對象,在ECMAScript5中,調用的是不一樣的RegExp對象 由於在EXCMAScript5中每執行一次,就生成一個新的RegExp對象code
因此在ECMAScript3中會形成程序的隱患,由於只要在一個地方對這個對象進行修改的話,全部調用到這個對象的地方都會變化。對象
1.直接量字符blog
在正則中通常都會直接匹配字符,如ip
/javascript/
會直接匹配字符javascript字符串
還支持非字母的字符匹配,如:io
\o NUL字符(\u0000)
\t 製表符(\u0009)
\n 換行符(\u000A)
\v 垂直製表符(\u000B)
\f 換頁符(\u000C)
\r 回車符(\u000D)
\xnn 由十六進制數nn指定的拉丁字符,例如,\x0A等價於\n
\uxxxx 由十六進制數xxxx指定的Unicode字符,例如\u0009等價於\t
\cX 控制字符^X,例如,\cJ等價於換行符\n
在正則表達式中,還有一些有特殊含義的標點符號,他們須要'\'來轉義
^$.*+?=!:|\/()[]{}
2.字符類
[...] 方括號內的任意字符
[^...] 不在方括號內的任意字符
. 任意字符
\w 任何ASCII字符組成的單詞,等價於[a-zA-Z0-9]
\W 任何不適ASCII字符組成的單詞,等價於[^a-zA-Z0-9]
\s 任何Unicode空白符
\S 任何非Unicode空白符的字符,注意\w和\S不同
\d 任何ASCII數值,等價於[0-9]
\D 除了ASCII數字以外的任何字符,等價於[^0-9]
[\b] 退格直接量(特例)
3.重複(次數)
? 0或1次
+ 1次或屢次
* 任意次
{n} n次
{m,n} 最少m次,最多n次
{n,} n次或n次以上
正則默認是貪婪匹配的
如[a+b+] 若是要匹配aaabb,它不會匹配ab和aab等,只會匹配aaabb
[a+?b+?] 這個會匹配aaab 爲何會產生這個區別呢?
答:+?是讓正則非貪婪匹配,那麼b這裏只會匹配一個b,那爲何a會匹配3個呢?這是由於正則表達式的模式匹配老是會尋找字符串中第一個可能匹配的位置。
4.選項|分組|引用
| 用於分隔可供選擇的字符,如[ab|cd],他既能夠匹配ab也能夠匹配cd,注意:選擇項的嘗試匹配次序是左→右,所以[a|ab],當a匹配經過了以後,就不匹配ab了,就算ab是更好的匹配
() 1.單獨的項當成子表達式 /java(script)?/ 能夠匹配javascript和java 即圓括號部分造成子的表達式,能夠對子表達式執行| * ?等操做
2.完整的模式中定義子模式 後面的能夠引用前面圓括號起來的表達式 /(['"])[a-z]\1/ \1引用的是第一個圓括號裏的表達式,所以引用了['"]
3.後部引用前面的子表達式 注意: /['"][a-z]['"]/這個正則的意思是 單引號或雙引號加上一個小寫字母加上一個單引號或者雙引號,先後的單雙引號不是匹配的
若是你要匹配能夠這麼寫[(['"])[a-z]\1]
\加數字 能夠引用前面圓括號中的表達式
5.制定匹配位置(錨點)
^ 匹配字符串的開頭,在多行檢索中,匹配一行的開頭
$ 匹配字符串的結尾,在多行檢索中,匹配一行的結尾
\b 匹配一個單詞的邊界,簡言之,就是位於字符\w和\W之間的位置,或位於字符\w和字符串的開頭或者結尾之間的位置
\B 匹配非單詞邊界的位置
(?=p) 零寬正向先行斷言,要求接下來的字符都與p匹配,但不能包括匹配p的那些字符
(?!p) 零寬負向先行斷言,要求接下來的字符不與p匹配
6.修飾符
寫在正則表達式字面量//右側的
i 執行不區分大小寫的匹配
g 執行一個全局匹配,簡言之,即找到全部的匹配,而不是在找到第一個以後就中止
m 多行匹配模式,^匹配一行的開頭和字符串的開頭,$匹配行的結束和字符串的結束 /java$/m 能夠匹配 java\nfunc
注意:當正則表達式是全局的時候,每次exec() 和 test()的時候都會把當前設置的lastIndex設爲當前的位置,再次執行的時候就會從lastIndex的位置開始執行,所以最好每次執行的時候lastIndex設置爲0