一 : 語(yǔ)法規(guī)則
1.RegExp構(gòu)造函數(shù)創(chuàng)建了一個(gè)正則表達(dá)式對(duì)象,用于將文本與一個(gè)模式匹配浴讯。
2.RegExp 由兩個(gè)部分組成
????①pattern(正則表達(dá)式的文本)
????② flags?(正則表達(dá)匹配規(guī)則描述)
????????????g:全局匹配;找到所有匹配,而不是在第一個(gè)匹配后停止
????????????i:忽略大小寫(xiě)
? ? ? ? ? ? m:多行; 將開(kāi)始和結(jié)束字符(^和$)視為在多行上工作(也就是分別匹配每一行的開(kāi)始和結(jié)束(由 \n 或 \r分割)蔼啦,而不只是只匹配整個(gè)輸入字符串的最開(kāi)始和最末尾處榆纽。
u:Unicode;?將模式視為Unicode序列點(diǎn)的序列
????????????y:粘性匹配;?僅匹配目標(biāo)字符串中此正則表達(dá)式的lastIndex屬性指示的索引(并且不嘗試從任何后續(xù)的索引匹配)
正則實(shí)例: /^[a-zA-z]+\.[a-zA-z]+\.(cn|com|info|top)/gi? ?域名匹配。
二: 創(chuàng)建形式(兩種方式)
1.字面量?eg:? var a =? /^1\d{2}-\d{4}-\d{4}/g(電話(huà)號(hào)碼匹配)
2.構(gòu)造函數(shù)?eg:?var a =? new RegExp(?/^1\d{2}-\d{4}-\d{4}/g)
三:表達(dá)式中特殊字符的含義
字符類(lèi)別(Character Classes)
字符含義
.(點(diǎn)號(hào)捏肢,小數(shù)點(diǎn)) 匹配任意單個(gè)字符奈籽,但是行結(jié)束符除外:\n\r\u2028或\u2029。
在字符集中鸵赫,點(diǎn)( . )失去其特殊含義衣屏,并匹配一個(gè)字面點(diǎn)( . )。
需要注意的是辩棒,m多行(multiline)標(biāo)志不會(huì)改變點(diǎn)號(hào)的表現(xiàn)狼忱。因此為了匹配多行中的字符集,可使用[^](當(dāng)然你不是打算用在舊版本 IE 中)盗温,它將會(huì)匹配任意字符藕赞,包括換行符。
例如卖局,/.y/匹配 "yes make my day" 中的?"my" 和 "ay"斧蜕,但是不匹配 "yes"。
\d匹配任意阿拉伯?dāng)?shù)字砚偶。等價(jià)于[0-9]批销。
例如,/\d/或/[0-9]/匹配 "B2 is the suite number." 中的?'2'染坯。
\D匹配任意一個(gè)不是阿拉伯?dāng)?shù)字的字符均芽。等價(jià)于[^0-9]。
例如单鹿,/\D/或/[^0-9]/匹配 "B2 is the suite number." 中的?'B'掀宋。
\w匹配任意來(lái)自基本拉丁字母表中的字母數(shù)字字符,還包括下劃線(xiàn)。等價(jià)于[A-Za-z0-9_]劲妙。
例如湃鹊,/\w/匹配 "apple" 中的 'a',"$5.28" 中的 '5' 和 "3D" 中的 '3'镣奋。
\W匹配任意不是基本拉丁字母表中單詞(字母數(shù)字下劃線(xiàn))字符的字符币呵。等價(jià)于[^A-Za-z0-9_]。
例如侨颈,/\W/或/[^A-Za-z0-9_]/匹配 "50%" 中的 '%'余赢。
\s匹配一個(gè)空白符,包括空格哈垢、制表符妻柒、換頁(yè)符、換行符和其他 Unicode 空格耘分。
等價(jià)于[ \f\n\r\t\v?\u00a0\u1680?\u180e\u2000?\u2001\u2002?\u2003\u2004? \u2005\u2006?\u2007\u2008?\u2009\u200a?\u2028\u2029??\u202f\u205f? \u3000]蛤奢。
例如/\s\w*/匹配 "foo bar" 中的 ' bar'。
\S匹配一個(gè)非空白符陶贼。等價(jià)于[^ \f\n\r\t\v?\u00a0\u1680?\u180e\u2000?\u2001\u2002?\u2003\u2004??\u2005\u2006?\u2007\u2008?\u2009\u200a?\u2028\u2029?\u202f\u205f?\u3000]啤贩。
例如,/\S\w*/匹配 "foo bar" 中的 'foo'拜秧。
\t匹配一個(gè)水平制表符(tab)
\r匹配一個(gè)回車(chē)符(carriage return)
\n匹配一個(gè)換行符(linefeed)
\v匹配一個(gè)垂直制表符(vertical tab)
\f匹配一個(gè)換頁(yè)符(form-feed)
[\b]匹配一個(gè)退格符(backspace)(不要與\b混淆)
\0匹配一個(gè) NUL 字符痹屹。不要在此后面跟小數(shù)點(diǎn)。
\cXX是 A - Z 的一個(gè)字母枉氮。匹配字符串中的一個(gè)控制字符志衍。
例如,/\cM/匹配字符串中的 control-M聊替。
\xhh匹配編碼為hh(兩個(gè)十六進(jìn)制數(shù)字)的字符楼肪。
\uhhhh匹配 Unicode 值為hhhh(四個(gè)十六進(jìn)制數(shù)字)的字符。
\對(duì)于那些通常被認(rèn)為字面意義的字符來(lái)說(shuō)惹悄,表示下一個(gè)字符具有特殊用處春叫,并且不會(huì)被按照字面意義解釋。
例如/b/匹配字符 'b'泣港。在 b 前面加上一個(gè)反斜杠暂殖,即使用/\b/,則該字符變得特殊当纱,以為這匹配一個(gè)單詞邊界呛每。
或
對(duì)于那些通常特殊對(duì)待的字符,表示下一個(gè)字符不具有特殊用途坡氯,會(huì)被按照字面意義解釋晨横。
例如洋腮,* 是一個(gè)特殊字符,表示匹配某個(gè)字符 0 或多次手形,如/a*/意味著 0 或多個(gè) "a"徐矩。 為了匹配字面意義上的*,在它前面加上一個(gè)反斜杠叁幢,例如,/a\*/匹配 'a*'坪稽。
字符集合(Character Sets)
字符含義
[xyz]一個(gè)字符集合曼玩,也叫字符組。匹配集合中的任意一個(gè)字符窒百。你可以使用連字符'-'指定一個(gè)范圍黍判。
例如,[abcd] 等價(jià)于 [a-d]篙梢,匹配"brisket"中的'b'和"chop"中的'c'顷帖。
[^xyz]一個(gè)反義或補(bǔ)充字符集,也叫反義字符組渤滞。也就是說(shuō)贬墩,它匹配任意不在括號(hào)內(nèi)的字符。你也可以通過(guò)使用連字符 '-' 指定一個(gè)范圍內(nèi)的字符妄呕。
例如陶舞,[^abc]等價(jià)于[^a-c]。第一個(gè)匹配的是 "bacon" 中的'o' 和 "chop" 中的 'h'绪励。
邊界(Boundaries)
字符含義
^匹配輸入開(kāi)始肿孵。如果多行(multiline)標(biāo)志被設(shè)為 true,該字符也會(huì)匹配一個(gè)斷行(line break)符后的開(kāi)始處疏魏。
例如停做,/^A/不匹配 "an A" 中的 "A",但匹配 "An A" 中的 "A"大莫。
$匹配輸入結(jié)尾蛉腌。如果多行(multiline)標(biāo)志被設(shè)為 true,該字符也會(huì)匹配一個(gè)斷行(line break)符的前的結(jié)尾處只厘。
例如眉抬,/t$/不匹配 "eater" 中的 "t",但匹配 "eat" 中的 "t"懈凹。
\b匹配一個(gè)零寬單詞邊界(zero-width word boundary)蜀变,如一個(gè)字母與一個(gè)空格之間。 (不要和[\b]混淆)
例如介评,/\bno/匹配 "at noon" 中的 "no"库北,/ly\b/匹配 "possibly yesterday." 中的 "ly"爬舰。
\B匹配一個(gè)零寬非單詞邊界(zero-width non-word boundary),如兩個(gè)字母之間或兩個(gè)空格之間寒瓦。
例如情屹,/\Bon/匹配 "at noon" 中的 "on",/ye\B/匹配 "possibly yesterday." 中的 "ye"杂腰。
分組(Grouping)與反向引用(back references)
字符含義
(x)匹配x并且捕獲匹配項(xiàng)垃你。 這被稱(chēng)為捕獲括號(hào)(capturing parentheses)。
例如喂很,/(foo)/匹配且捕獲 "foo bar." 中的 "foo"惜颇。被匹配的子字符串可以在結(jié)果數(shù)組的元素[1], ..., [n]中找到,或在被定義的RegExp對(duì)象的屬性$1, ..., $9中找到少辣。
捕獲組(Capturing groups)有性能懲罰凌摄。如果不需再次訪(fǎng)問(wèn)被匹配的子字符串,最好使用非捕獲括號(hào)(non-capturing parentheses)漓帅,見(jiàn)下面锨亏。
\nn是一個(gè)正整數(shù)。一個(gè)反向引用(back reference)忙干,指向正則表達(dá)式中第 n 個(gè)括號(hào)(從左開(kāi)始數(shù))中匹配的子字符串器予。
例如,/apple(,)\sorange\1/匹配 "apple, orange, cherry, peach." 中的 "apple,orange,"捐迫。一個(gè)更全面的例子在該表格下面劣摇。
(?:x)匹配x不會(huì)捕獲匹配項(xiàng)。這被稱(chēng)為非捕獲括號(hào)(non-capturing parentheses)弓乙。匹配項(xiàng)不能夠從結(jié)果數(shù)組的元素[1], ..., [n]或已被定義的RegExp對(duì)象的屬性$1, ..., $9再次訪(fǎng)問(wèn)到末融。
數(shù)量詞(Quantifiers)
字符含義
x*匹配前面的模式x0 或多次。
例如暇韧,/bo*/匹配 "A ghost booooed" 中的 "boooo"勾习,"A bird warbled" 中的 "b",但是不匹配 "A goat grunted"懈玻。
x+匹配前面的模式x1 或多次巧婶。等價(jià)于{1,}。
例如涂乌,/a+/匹配 "candy" 中的 "a"艺栈,"caaaaaaandy" 中所有的 "a"。
x*?
x+?
像上面的 * 和 + 一樣匹配前面的模式x湾盒,然而匹配是最小可能匹配湿右。
例如,/".*?"/匹配 '"foo" "bar"' 中的 '"foo"'罚勾,而 * 后面沒(méi)有 ? 時(shí)匹配 '"foo" "bar"'毅人。
x?匹配前面的模式x0 或 1 次吭狡。
例如,/e?le?/匹配 "angel" 中的 "el"丈莺,"angle" 中的 "le"划煮。
如果在數(shù)量詞*、+缔俄、?或{}, 任意一個(gè)后面緊跟該符號(hào)(?)弛秋,會(huì)使數(shù)量詞變?yōu)榉秦澙罚?non-greedy) ,即匹配次數(shù)最小化俐载。反之蟹略,默認(rèn)情況下,是貪婪的(greedy)瞎疼,即匹配次數(shù)最大化。
在使用于向前斷言(lookahead assertions)時(shí)壁畸,見(jiàn)該表格中(?=)贼急、(?!)和(?:)的說(shuō)明。
x(?=y)只有當(dāng)x后面緊跟著y時(shí)捏萍,才匹配x太抓。 例如,/Jack(?=Sprat)/只有在 'Jack' 后面緊跟著 'Sprat' 時(shí)令杈,才會(huì)匹配它走敌。/Jack(?=Sprat|Frost)/只有在 'Jack' 后面緊跟著 'Sprat' 或 'Frost' 時(shí),才會(huì)匹配它逗噩。然而掉丽,'Sprat' 或 'Frost' 都不是匹配結(jié)果的一部分。
x(?!y)只有當(dāng)x后面不是緊跟著y時(shí)异雁,才匹配x捶障。例如,/\d+(?!\.)/只有當(dāng)一個(gè)數(shù)字后面沒(méi)有緊跟著一個(gè)小數(shù)點(diǎn)時(shí)纲刀,才會(huì)匹配該數(shù)字项炼。
/\d+(?!\.)/.exec("3.141")匹配 141 而不是 3.141。
x|y匹配x或y
例如示绊,/green|red/匹配 "green apple" 中的 ‘green'锭部,"red apple." 中的 'red'。
x{n}n是一個(gè)正整數(shù)面褐。前面的模式x連續(xù)出現(xiàn) n 次時(shí)匹配拌禾。
例如,/a{2}/不匹配 "candy," 中的 "a"展哭,但是匹配 "caandy," 中的兩個(gè) "a"蹋砚,且匹配 "caaandy." 中的前兩個(gè) "a"扼菠。
x{n,}n是一個(gè)正整數(shù)。前面的模式x連續(xù)出現(xiàn)至少 n 次時(shí)匹配坝咐。
例如循榆,/a{2,}/不匹配 "candy" 中的 "a",但是匹配 "caandy" 和 "caaaaaaandy." 中所有的 "a"墨坚。
x{n,m}n和m為正整數(shù)秧饮。前面的模式 x 連續(xù)出現(xiàn)至少 n 次,至多 m 次時(shí)匹配泽篮。
例如盗尸,/a{1,3}/不匹配 "cndy",匹配 "candy," 中的 "a"泼各,"caandy," 中的兩個(gè) "a",匹配 "caaaaaaandy" 中的前面三個(gè) "a"亏拉。注意,當(dāng)匹配 "caaaaaaandy" 時(shí)及塘,即使原始字符串擁有更多的 "a",匹配項(xiàng)也是 "aaa"笙僚。
斷言(Assertions)
字符含義
x(?=y)僅匹配被y跟隨的x。
舉個(gè)例子肋层,/Jack(?=Sprat)/,如果"Jack"后面跟著sprat栋猖,則匹配之责嚷。
/Jack(?=Sprat|Frost)/罕拂,如果"Jack"后面跟著"Sprat"或者"Frost",則匹配之全陨。但是,"Sprat" 和"Frost" 都不會(huì)在匹配結(jié)果中出現(xiàn)辱姨。
x(?!y)僅匹配不被y跟隨的x。
舉個(gè)例子雨涛,/\d+(?!\.)/只會(huì)匹配不被點(diǎn)(.)跟隨的數(shù)字枢舶。
/\d+(?!\.)/.exec('3.141')?匹配"141"懦胞,而不是"3.141
四 : 正則對(duì)象的屬性和內(nèi)置方法
1: 屬性
注意,RegExp對(duì)象的幾個(gè)屬性既有完整的長(zhǎng)屬性名凉泄,也有對(duì)應(yīng)的類(lèi) Perl 的短屬性名躏尉。兩個(gè)屬性都有著同樣的值。JavaScript 的正則語(yǔ)法就是基于 Perl 的后众。
RegExp.prototype.constructor
創(chuàng)建該正則對(duì)象的構(gòu)造函數(shù)胀糜。
是否開(kāi)啟全局匹配,也就是匹配目標(biāo)字符串中所有可能的匹配項(xiàng)蒂誉,而不是只進(jìn)行第一次匹配教藻。
在匹配字符串時(shí)是否要忽略字符的大小寫(xiě)。
下次匹配開(kāi)始的字符串索引位置右锨。
是否開(kāi)啟多行模式匹配(影響 ^ 和 $ 的行為)括堤。
正則對(duì)象的源模式文本。?
是否開(kāi)啟粘滯匹配绍移。
RegExp.length?
RegExp.length值為 2悄窃。
2: 方法
在目標(biāo)字符串中執(zhí)行一次正則匹配操作。
測(cè)試當(dāng)前正則是否能匹配目標(biāo)字符串登夫。
? ??????返回一個(gè)字符串广匙,其值為該正則對(duì)象的字面量形式允趟。覆蓋了Object.prototype.toSource方法.
返回一個(gè)字符串恼策,其值為該正則對(duì)象的字面量形式。覆蓋了
Object.prototype.toString()方法潮剪。
四 : 正則實(shí)例
1:郵箱匹配:/^([a-zA-Z]|\d)*@[a-zA-Z]+\.[a-zA-Z]+$/gi
2:手機(jī)號(hào)碼: /^1\d{2}-\d{4}-\d{4}$/g
3:鏈接:/^(http|https):\\\\[a-zA-Z]+\.([a-zA-Z]|\d)+\.(cn|com):\d*\\.*$/g
4:日期格式 :/^\d{4}-\d{1,2}-\d{1,2}$/g
5:強(qiáng)密碼(必須包含大小寫(xiě)字母和數(shù)字的組合涣楷,不能使用特殊字符,長(zhǎng)度在8-10之間):/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$/五