第一種:用RegExp()構造函數來創建RegExp對象
var pattern = new RegExp("[abc]"); 匹配a、b、c中的任意一個字符
第二種:通過直接量語法創建,直接量的定義包含在一對斜槓(/)之間,這種方式更常用。
var pattern = /[abc]/; 匹配a、b、c中的任意一個字符
字符 匹配字母和數字匹配 自身\o NUL字符(\u0000)\t 制表符(\u0000)\n 換行符(\u0000)\v 垂直制表符(\u0000)\f 換頁符(\u0000)\r 回車符(\u0000)\xnn 由十六進位數字nn指定的拉丁字符,例如, \x0A等坐於\n\uxxxx 由十六進位數字xxxx指定的Unicode字符,例如,\u0009等價於\t\cX 控制字符^X,例如 \cJ等價於換行符\n
注意:在正則表達式中,許多標點符號都有特殊的含義,如果想到正則表達式中使用這些字符的直接量進行匹配,則必須使用前綴\
特殊含義字符: ^ $ . * + = !: | \ / ( ) [ ] { }
直接輸出格式: \^ \$ \( \) 等
1、 一個字符類可以匹配它所包含的任意字符。
/[abc]/ 和字母 "a"、"b"、"c"中的任意一個都匹配
2、 可以通過 "^" 符號來定義否定字符類
/[^abc]/ 匹配所有不包含在方括號內的字符
3、 可以使用連字符來表示範圍
/[a-z]/ 匹配拉丁字母表中的小寫字母
/[a-zA-Z0-9]/ 匹配拉丁字母中任何字母和數字
4、 由於某些字符特別有用,因此使用這些字符的轉義字符來表示它們
[XXX] 匹配中括號內的任意字符
[^XXX] 匹配不在括號內的任意字符
. 除換行符和其它Unicode行終止符之外的任意字符
\w 任何ASCII字符組成的單詞,等價於[a-zA-z0-9]
\W 任何不是ASCII字符組成的單詞,等價於[^a-zA-z0-9]
\s 匹配的是空格、制表符和其它Unicode空白符
\S 匹配的是非Unicode空白符的字符
\d 任何ASCII數字,等價於[0-9]
\D 除了ASCII數字之外的任何字符,等價於[^0-9]
[\b] 退格直接量(特例)
/^[\x{4e00}-\x{9fa5}]+$/u 區配中文 /utf-8
組合匹配
[\s\d] 任意空白符或數字
5、重複(儘可能多的匹配)
{n,m} 匹配前一項至少n次,但不能超過m次{n,} 匹配前一項n次或更多次{n} 匹配前一項n次? 匹配前一項0次或1次,也就是前一項是可選的,等價於{0,1}+ 匹配前一項1次或多次,等價於{1,}* 匹配前一項0次或多次,等價於{0,}
例子:
/\d{2,4}/ 匹配2到4個數字/\w{3}\d?/ 精確匹配三個單詞和一個可選的數字 acd1 add a011/\s+Java\s+/ 匹配前後帶有最少一個空格的字符串 "java this java is java javasript "/[^(]*/ 匹配一個或多個不是左括號的字符
注意 * 與 ? 的使用 /a*/ 實際上與字符串 "abcd"匹配,因為這個字符串中有 0 個a
6、 非貪婪的重複(儘可能少的匹配
例:當使用 aaa 做為匹配字符串時,
/a+/ 會匹配它的三個字符a/a+?/ 會匹配只能匹配一個a
特殊:當使用aaab做為匹配字符串時
/a+b/ 匹配整個字符串/a+?b/ 本來期待匹配ab,但實際上匹配了aaab,這是因為正則表達式總會尋找字符串中第一個可能匹配的位置
7、 選擇、分組和引用
/ab|cd|ef/ 可以匹配字符串 ab,也可以匹配cd,也可以匹配ef/\d{3}|[a-z]{4}/ 匹配三位數字或者四個小寫字母
/a|ab/ 匹配字符串ab時,匹配上的是a
括號()的作用一:
把單獨的項組合成表達式
/java(script)?/ 匹配字符串java,後面可以有script,也可以沒有/(ab|cd)+|ef/ 匹配字符串ef,也可以匹配字符串ab或cd的一次或多次
括號()的作用二:
在完整的模式中,定義子模式
/[a-z]+\d+/ 匹配一個或多個字母後面跟了一個或多個數字,但是我們想要的是後面的數字,可以改為/[a-z]+(\d)+/ 這樣我們就可以從檢索到的匹配中抽取數字了 ????????????
括號()的作用三:
分組,方便數字引用。允許在同一表達式後面引用前面的子表達式,通過在\後面加一位或多位數字來實現
\1 表示引用前面第一個帶()的子表達式,\2表示引用前面第二個帶()的子表達式
/['"][^'"]*['"]/ 匹配帶單引號或雙引號的字符串,可以寫成 // "a.jpg" '#box' ".wrapper"
/(['"])[^'"]*\1/
注意:對於嵌套的子表達式,其順序是以左括號(為準
例如: /([Jj]ava([Ss]cript)?)\sis\s(fun\w*)/
其中嵌套的子表達式[Ss]cript可以用\2來表示
括號()的作用四:
不計入數字引用的分組
/([Jj]ava(?:[Ss]cript)?)\sis\s(fun\w*)/
在上面這個分組中,(?:[Ss]cript)?) 這個分組並不生成數字引用,所以\2 表示引用了 (fun\w*)這個分組
綜合複習:
| 選擇,匹配的是該符號左邊的子表達式或右邊的子表達式 //
(...) 組合 將幾個項組合為一個單元,這個單元可通過 * + ? ! |等符號加以修飾,而且可以記住和這個組合相匹配的字符
串以供此後的使用引用
(?:...) 只組合,但不記憶與該組相匹配的字符
\n 和第n個分組第一次匹配的字符相匹配
8、 匹配位置
^ 匹配字符串的開頭,在多行檢索中,匹配一行的開頭 /^[Jj]\w*[Ss]$/
$ 匹配字符串的結尾,在多行檢索中,匹配一行的結尾
\b 匹配一個單詞的邊界
1、就是位於\w和\W之間的位置
2、或位於字符\w和字符串的開頭或結尾之間的位置
3、注意:[\b]匹配的是退格符
str = "java is a good,but javascript is also,so java is ,so java"
/\b[jJ]ava\b/
\B 匹配非單詞邊界的位置
(?=p) 零寬正向先行斷言,要求接下來的字符都與P匹配,但不能包括匹配p的好些字符
(?=!p) 零寬負向先行斷言,要求接下來的字符不與P匹配。
例子:
/^JavaScript$/ 匹配單詞JavaScript
/\sJava\s/ 匹配前後都有空格的單詞 Java,而不是做為 JavaScript的前綴存在,但是匹配不了兩頭的Java
/\bJava\b/ 匹配前後都有空格的單詞 Java,而不是做為 JavaScript的前綴存在,能夠匹配兩頭的Java
9、修飾符
i 執行不區分大小寫的匹配
g 執行一個全局匹配,即找到所有的匹配,而不是在找到第一個後停止
m 多行匹配模式,字符串如果有多行,^和&不僅匹配整個字符串的開頭與結尾,還能匹配每行的開頭與結尾
下一章,我們講正則表達式的函數應用範例。請同學們認真學習。