正則表達式的2種定義方法:一種是直接調用RegExp(),第二種是直接用字面量來定義,即var re = /正則規則/;
2種定義方法本質都是調用RegExp()方法
在調用同一段正則代碼的時候,ECMAScript3和ECMAScript5中表現完全不一樣
function reg(){ var re = /\sjavascript/; return re; }
分別在ECMAScript3和ECMAScript5中調用reg()方法多次
在ECMAScript3中,調用的是同一個RegExp對象,在ECMAScript5中,調用的是不同的RegExp對象 因為在EXCMAScript5中每執行一次,就生成一個新的RegExp對象
所以在ECMAScript3中會造成程序的隱患,因為只要在一個地方對這個對象進行修改的話,所有調用到這個對象的地方都會變化。
1.直接量字符
在正則中一般都會直接匹配字符,如
/javascript/
會直接匹配字符javascript
還支持非字母的字符匹配,如:
\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