JavaScript 正則表達(dá)式完整介紹

一 : 語(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匹配xy

例如示绊,/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}nm為正整數(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ù)胀糜。

RegExp.prototype.global

  是否開(kāi)啟全局匹配,也就是匹配目標(biāo)字符串中所有可能的匹配項(xiàng)蒂誉,而不是只進(jìn)行第一次匹配教藻。

RegExp.prototype.ignoreCase

  在匹配字符串時(shí)是否要忽略字符的大小寫(xiě)。

RegExp.prototype.lastIndex

  下次匹配開(kāi)始的字符串索引位置右锨。

RegExp.prototype.multiline

  是否開(kāi)啟多行模式匹配(影響 ^ 和 $ 的行為)括堤。

RegExp.prototype.source

  正則對(duì)象的源模式文本。?

RegExp.prototype.sticky

  是否開(kāi)啟粘滯匹配绍移。

RegExp.length?

  RegExp.length值為 2悄窃。

2: 方法  

RegExp.prototype.exec()

  在目標(biāo)字符串中執(zhí)行一次正則匹配操作。

RegExp.prototype.test()

  測(cè)試當(dāng)前正則是否能匹配目標(biāo)字符串登夫。

RegExp.prototype.toSource()

? ??????返回一個(gè)字符串广匙,其值為該正則對(duì)象的字面量形式允趟。覆蓋了Object.prototype.toSource方法.

RegExp.prototype.toString()

  返回一個(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}$/五

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末抗碰,一起剝皮案震驚了整個(gè)濱河市狮斗,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌弧蝇,老刑警劉巖碳褒,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異看疗,居然都是意外死亡澡屡,警方通過(guò)查閱死者的電腦和手機(jī)文虏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人孕蝉,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵删顶,是天一觀(guān)的道長(zhǎng)逗余。 經(jīng)常有香客問(wèn)我蒋纬,道長(zhǎng),這世上最難降的妖魔是什么关摇? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任输虱,我火速辦了婚禮宪睹,結(jié)果婚禮上蚕钦,老公的妹妹穿的比我還像新娘。我一直安慰自己罪帖,他們只是感情好邮屁,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布佑吝。 她就那樣靜靜地躺著,像睡著了一般芋忿。 火紅的嫁衣襯著肌膚如雪戈钢。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,688評(píng)論 1 305
  • 那天蝶溶,我揣著相機(jī)與錄音,去河邊找鬼梨州。 笑死田轧,一個(gè)胖子當(dāng)著我的面吹牛傻粘,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播弦悉,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼稽莉,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了劈猪?” 一聲冷哼從身側(cè)響起良拼,我...
    開(kāi)封第一講書(shū)人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤庸推,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后刮吧,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體掖蛤,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蚓庭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年器赞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了墓拜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡夏醉,死狀恐怖畔柔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情腮考,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布踩蔚,位于F島的核電站寂纪,受9級(jí)特大地震影響赌结,放射性物質(zhì)發(fā)生泄漏柬姚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一搬设、第九天 我趴在偏房一處隱蔽的房頂上張望撕捍。 院中可真熱鬧,春花似錦默色、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)贴硫。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間删壮,已是汗流浹背兑牡。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留亿虽,地道東北人苞也。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓如迟,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親殷勘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355