正則表達(dá)式
簡(jiǎn)介
? ? 正則表達(dá)式,又稱(chēng)規(guī)則表達(dá)式,(Regular Expression趴俘,在代碼中常簡(jiǎn)寫(xiě)為regex寥闪、regexp或RE)磨淌,是一種文本模式,包括普通字符(例如缚柳,a 到 z 之間的字母)和特殊字符(稱(chēng)為"元字符")秋忙,是計(jì)算機(jī)科學(xué)的一個(gè)概念灰追。正則表達(dá)式使用單個(gè)字符串來(lái)描述狗超、匹配一系列匹配某個(gè)句法規(guī)則的字符串努咐,通常被用來(lái)檢索、替換那些符合某個(gè)模式(規(guī)則)的文本佩迟。廣泛運(yùn)用于Scala 、PHP报强、C# 躺涝、Java坚嗜、C++ 诗充、Objective-c、Perl 碟绑、Swift格仲、VBScript 诵冒、Javascript、Ruby 以及Python等等侮东。正則表達(dá)式通城难牛縮寫(xiě)成“regex”铁蹈,單數(shù)有regexp握牧、regex,復(fù)數(shù)有regexps放案、regexes矫俺、regexen。
?目的
? ? 給定一個(gè)正則表達(dá)式和另一個(gè)字符串友雳,我們可以達(dá)到如下的目的:
? ? 1. 判斷給定的字符串是否符合正則表達(dá)式的過(guò)濾邏輯(稱(chēng)作“匹配”):
? ? 2. 可以通過(guò)正則表達(dá)式押赊,從字符串中獲取我們想要的特定部分流礁。
?特點(diǎn)
? ? 1. 靈活性、邏輯性和功能性非常強(qiáng);
? ? 2. 可以迅速地用極簡(jiǎn)單的方式達(dá)到字符串的復(fù)雜控制耀石。
? ? 3. 對(duì)于剛接觸的人來(lái)說(shuō),比較晦澀難懂。
? ? 4. 由于正則表達(dá)式主要應(yīng)用對(duì)象是文本,因此它在各種文本編輯器場(chǎng)合都有應(yīng)用蔽挠,小到著名編輯器EditPlus澳淑,大到Microsoft Word杠巡、Visual Studio等大型編輯器雇寇,都可以使用正則表達(dá)式來(lái)處理文本內(nèi)容
符號(hào)
? ? 正則表達(dá)式由一些普通字符和一些元字符(metacharacters)組成。普通字符包括大小寫(xiě)的字母和數(shù)字嫩海,而元字符則具有特殊的含義
?語(yǔ)法(JavaScript)
? ? ① var patt=new RegExp(pattern,modifiers);
? ? ② var patt=/pattern/modifiers;
? ? > pattern(模式) 描述了表達(dá)式的模式
? ? > modifiers(修飾符) 用于指定全局匹配叁怪、區(qū)分大小寫(xiě)的匹配和多行匹配
? ? 注意:當(dāng)使用構(gòu)造函數(shù)創(chuàng)造正則對(duì)象時(shí)深滚,需要常規(guī)的字符轉(zhuǎn)義規(guī)則(在前面加反斜杠 \)。比如官册,以下是等價(jià)的:
? ? var reg = new RegExp("\\w+");
? ? var reg = /\w+/;
修飾符 (修飾符用于執(zhí)行不區(qū)分大小寫(xiě)和全文的搜索难捌。)
? ? 1. i - 修飾符是用來(lái)執(zhí)行不區(qū)分大小寫(xiě)的匹配。
? ? ? ? var str = "Visit RUnoob";
? ? ? ? var patt1 = /runoob/i;
? ? ? ? console.log(str.match(patt1))
? ? ? ? 運(yùn)行結(jié)果:['RUnoob', index: 6, input: 'Visit RUnoob', groups: undefined] ?
? ? ? ? 對(duì)上述代碼運(yùn)行結(jié)果分析如下:
? ? ? ? (1).match方法在有匹配結(jié)果的時(shí)候返回值是一個(gè)數(shù)組员淫。
? ? ? ? (2).index屬性值返回首次匹配到子字符串的位置婴栽。
? ? ? ? (3).input屬性值是原字符串"antzone"愚争。
? ? ? ? (4).groups屬性當(dāng)前并不被支持轰枝,暫時(shí)不做介紹组去。
? ? 2. g - 修飾符是用于執(zhí)行全文的搜索(而不是在找到第一個(gè)就停止查找,而是找到所有的匹配)从隆。
? ? ? ? //全文查找 "is"
? ? ? ? var str = "Is this all there is?";
? ? ? ? var patt1 = /is/g;
? ? ? ? console.log(str.match(patt1))
? ? ? ? 運(yùn)行結(jié)果:(2)?['is', 'is']
? ? -------i g 結(jié)合查找---------
? ? ? ? //全文查找和不區(qū)分大小寫(xiě)搜索 "is"
? ? ? ? var str = "Is this all there is?";
? ? ? ? var patt1 = /is/gi;
? ? ? ? console.log(str.match(patt1));
? ? ? ? 運(yùn)行結(jié)果:(3)?['Is', 'is', 'is']
? ? 3. m - 執(zhí)行多行匹配(使邊界字符 ^ 和 $ 匹配每一行的開(kāi)頭和結(jié)尾键闺,記住是多行,而不是整個(gè)字符串的開(kāi)頭和結(jié)尾筛武。)
? ? ? ? //匹配字符串'an'
? ? ? ? var str = "This is an\n antzone good";
? ? ? ? var reg = /an$/m
? ? ? ? console.log(str.match(reg));
? ? ? ? 運(yùn)行結(jié)果:['an', index: 8, input: 'This is an\n antzone good', groups: undefined]
? ? ? ? 說(shuō)明:可以匹配字符串"an"徘六,因?yàn)椴捎昧硕嘈衅ヅ洹?/p>
? ? ? ? var str = "This is an\n antzone good";
? ? ? ? var reg1 = /an$/
? ? ? ? console.log(str.match(reg1));
? ? ? ? 運(yùn)行結(jié)果:null
? ? ? ? 說(shuō)明:不能夠匹配字符串"an"待锈,盡管"an"后面已經(jīng)換行了炉擅,但是并沒(méi)有采用多行匹配,所以不是字符串行的結(jié)尾眶俩。
? ? -------g m ?結(jié)合匹配-------
? ? ? ? m 修飾符可以使 ^ 和 $ 匹配一段文本中每行的開(kāi)始和結(jié)束位置颠印。
? ? ? ? g 只匹配第一行抹竹,添加 m 之后實(shí)現(xiàn)多行窃判。
? ? ? ? var str = "runoobgoogle\ntaobao\nrunoobweibo";
? ? ? ? var n1 = str.match(/^runoob/g); // 匹配一個(gè)
? ? ? ? var n2 = str.match(/^runoob/gm); // 多行匹配
? ? ? ? console.log(n1)
? ? ? ? console.log(n2)
? ? ? ? 運(yùn)行結(jié)果:['runoob']
? ? ? ? ? ? ? ? (2)?['runoob', 'runoob']
? ? 4. s - 特殊字符圓點(diǎn) . 中包含換行符 \n(默認(rèn)情況下的圓點(diǎn) . 是匹配除換行 ?符 \n 之外的任何字符袄琳,加上 s 修飾符之后, . 中包含換行符 \n唆樊。)
? ? ? ? //在字符串中查找:
? ? ? ? var str = "google\nrunoob\ntaobao";
? ? ? ? var n1 = str.match(/google./); // 沒(méi)有使用 s,無(wú)法匹配\n
? ? ? ? var n2 = str.match(/runoob./s); // 使用 s逗旁,匹配\n
? ? ? ? console.log(n1)
? ? ? ? console.log(n2)
? ? ? ? 運(yùn)行結(jié)果:null
? ? ? ? ? ? ? ? ?['runoob\n', index: 7, input: 'google\nrunoob\ntaobao', groups: undefined]
元字符
? ? \ ? 將下一個(gè)字符標(biāo)記為一個(gè)特殊字符、或一個(gè)原義字符红伦、或一個(gè) 向后引用淀衣、或一個(gè)八進(jìn)制轉(zhuǎn)義符舌缤。例如国撵,'n' 匹配字符 "n"。'\n' 匹配一個(gè)換行符介牙。序列 '\\' 匹配 "\" 而 "\(" 則匹配 "("壮虫。
? ? ^ ? 匹配輸入字符串的開(kāi)始位置。如果設(shè)置了 RegExp 對(duì)象的 Multiline 屬性,^ 也匹配 '\n' 或 '\r' 之后的位置囚似。
? ? $ ? 匹配輸入字符串的結(jié)束位置剩拢。如果設(shè)置了RegExp 對(duì)象的 Multiline 屬性,$ 也匹配 '\n' 或 '\r' 之前的位置饶唤。
? ? * ? 匹配前面的子表達(dá)式零次或多次徐伐。例如,zo* 能匹配 "z" 以及 "zoo"募狂。* 等價(jià)于{0,}办素。
? ? + ? 匹配前面的子表達(dá)式一次或多次祸穷。例如需曾,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"桑嘶。+ 等價(jià)于 {1,}讨便。
? ? ? ? 匹配前面的子表達(dá)式零次或一次。例如废菱,"do(es)?" 可以匹配 "do" 或 "does" 。? 等價(jià)于 {0,1}樊零。
? ? {n} n 是一個(gè)非負(fù)整數(shù)夺艰。匹配確定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o'愕贡,但是能匹配 "food" 中的兩個(gè) o。
? ? {n,} ?n 是一個(gè)非負(fù)整數(shù)。至少匹配n 次篙螟。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o蕾久。'o{1,}' 等價(jià)于 'o+'。'o{0,}' 則等價(jià)于 'o*'。
? ? {n,m} ? m 和 n 均為非負(fù)整數(shù)杯拐,其中n <= m朗兵。最少匹配 n 次且最多匹配 m 次礁鲁。例如冗美,"o{1,3}" 將匹配 "fooooood" 中的前三個(gè) o。'o{0,1}' 等價(jià)于 'o?'。請(qǐng)注意在逗號(hào)和兩個(gè)數(shù)之間不能有空格。
? ? ? ? 當(dāng)該字符緊跟在任何一個(gè)其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面時(shí)锅棕,匹配模式是非貪婪的艾岂。非貪婪模式盡可能少的匹配所搜索的字符串,而默認(rèn)的貪婪模式則盡可能多的匹配所搜索的字符串。例如钞啸,對(duì)于字符串 "oooo"梭稚,'o+?' 將匹配單個(gè) "o",而 'o+' 將匹配所有 'o'。
? ? x|y 匹配 x 或 y。例如幔崖,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 則匹配 "zood" 或 "food"渣淤。
? ? [xyz] ? 字符集合赏寇。匹配所包含的任意一個(gè)字符。例如价认, '[abc]' 可以匹配 "plain" 中的 'a'渠退。
? ? [^xyz] ?負(fù)值字符集合。匹配未包含的任意字符及穗。例如丸氛, '[^abc]' 可以匹配 "plain" 中的'p'摹察、'l'、'i'杂伟、'n'蕾羊。
? ? [a-z] ? 字符范圍。匹配指定范圍內(nèi)的任意字符割按。例如丈氓,'[a-z]' 可以匹配 'a' 到 'z' 范圍內(nèi)的任意小寫(xiě)字母字符嘉赎。
? ? [^a-z] ?負(fù)值字符范圍关霸。匹配任何不在指定范圍內(nèi)的任意字符识埋。例如,'[^a-z]' 可以匹配任何不在 'a' 到 'z' 范圍內(nèi)的任意字符。
? ? \b ?匹配一個(gè)單詞邊界诵盼,也就是指單詞和空格間的位置。例如骂际, 'er\b' 可以匹配"never" 中的 'er'臼勉,但不能匹配 "verb" 中的 'er'。
? ? \B ?匹配非單詞邊界剧董。'er\B' 能匹配 "verb" 中的 'er'幢尚,但不能匹配 "never" 中的 'er'破停。
? ? \cx ?匹配由 x 指明的控制字符翅楼。例如尉剩, \cM 匹配一個(gè) Control-M 或回車(chē)符。x 的值必須為 A-Z 或 a-z 之一毅臊。否則理茎,將 c 視為一個(gè)原義的 'c' 字符。
? ? \d ?匹配一個(gè)數(shù)字字符管嬉。等價(jià)于 [0-9]皂林。
? ? \D ?匹配一個(gè)非數(shù)字字符。等價(jià)于 [^0-9]蚯撩。
? ? \f ?匹配一個(gè)換頁(yè)符础倍。等價(jià)于 \x0c 和 \cL。
? ? \n ?匹配一個(gè)換行符胎挎。等價(jià)于 \x0a 和 \cJ沟启。
? ? \r ?匹配一個(gè)回車(chē)符。等價(jià)于 \x0d 和 \cM犹菇。
? ? \s ?匹配任何空白字符德迹,包括空格、制表符揭芍、換頁(yè)符等等胳搞。等價(jià)于 [ \f\n\r\t\v]。
? ? \S ?匹配任何非空白字符称杨。等價(jià)于 [^ \f\n\r\t\v]肌毅。
? ? \t ?匹配一個(gè)制表符。等價(jià)于 \x09 和 \cI姑原。
? ? \v ?匹配一個(gè)垂直制表符悬而。等價(jià)于 \x0b 和 \cK。
? ? \w ?匹配字母页衙、數(shù)字摊滔、下劃線(xiàn)。等價(jià)于'[A-Za-z0-9_]'店乐。
? ? \W ?匹配非字母艰躺、數(shù)字、下劃線(xiàn)眨八。等價(jià)于 '[^A-Za-z0-9_]'腺兴。
? ? \xxx ? ?查找以八進(jìn)制數(shù) xxx 規(guī)定的字符。
? ? \xdd ? ?查找以十六進(jìn)制數(shù) dd 規(guī)定的字符廉侧。
? ? \uxxxx ?查找以十六進(jìn)制數(shù) xxxx 規(guī)定的 Unicode 字符页响。
? ? ? // 匹配郵箱的正則表達(dá)式
? ? ? ? var str = "abcd test@runoob.com 1234";
? ? ? ? var patt1 = /\b[\w.%+-]+@[\w.-]+\.[a-zA-Z]{2,6}\b/g;
? ? ? ? console.log(str.match(patt1));
? ? ? ? 運(yùn)行結(jié)果:['test@runoob.com']
?運(yùn)算符優(yōu)先級(jí)
? ? 從最高到最低說(shuō)明了各種正則表達(dá)式運(yùn)算符的優(yōu)先級(jí)順序:
? ? \ ? 轉(zhuǎn)義符
? ? (), (?:), (?=), [] ?括號(hào)和中括號(hào)
? ? *, +, ?, {n}, {n,}, {n,m} ? 限定符
? ? ^, $, \任何元字符篓足、任何字符 ? ? 定位點(diǎn)和序列
? ? | ? 替換
方括號(hào)
? ? [a-z] // 匹配所有的小寫(xiě)字母
? ? [A-Z] // 匹配所有的大寫(xiě)字母
? ? [a-zA-Z] // 匹配所有的字母
? ? [0-9] // 匹配所有的數(shù)字
? ? [0-9\.\-] // 匹配所有的數(shù)字,句號(hào)和減號(hào)
? ? [ \f\r\t\n] // 匹配所有的白字符
? ? [^a-z] //除了小寫(xiě)字母以外的所有字符
? ? [^\\\/\^] //除了(\)(/)(^)之外的所有字符
? ? [^\"\'] //除了雙引號(hào)(")和單引號(hào)(')之外的所有字符
?花括號(hào)的三種不同的用法(一個(gè)數(shù)字 {x} 的意思是前面的字符或字符簇只出現(xiàn)x次 闰蚕;一個(gè)數(shù)字加逗號(hào) {x,} 的意思是前面的內(nèi)容出現(xiàn)x或更多的次數(shù) 栈拖;兩個(gè)數(shù)字用逗號(hào)分隔的數(shù)字 {x,y} 表示 前面的內(nèi)容至少出現(xiàn)x次,但不超過(guò)y次)
? ? ^[a-zA-Z0-9_]{1,}$ ? ? ?// 所有包含一個(gè)以上的字母没陡、數(shù)字或下劃線(xiàn)的字符串
? ? ^[1-9][0-9]{0,}$ ? ? ? ?// 所有的正整數(shù)
? ? ^\-{0,1}[0-9]{1,}$ ? ? ?// 所有的整數(shù)
? ? ^[-]?[0-9]+\.?[0-9]+$ ? // 所有的浮點(diǎn)數(shù)
方法
?exec() 方法用于檢索字符串中的正則表達(dá)式的匹配涩哟。如果字符串中有匹配的值返回該匹配值,否則返回 null盼玄。
? ? var str = "Hello world!";
? ? //查找"Hello"
? ? var a = /Hello/g;
? ? var result = a.exec(str);
? ? console.log("返回值: " + result);
? ? //查找 "World"
? ? b = /World/g;
? ? result = b.exec(str);
? ? console.log("返回值: " + result);
? ? 運(yùn)行結(jié)果:返回值: Hello
? ? ? ? ? ? ?返回值: null
test() 方法用于檢測(cè)一個(gè)字符串是否匹配某個(gè)模式.如果字符串中有匹配的值返回 true 贴彼,否則返回 false。
? ? ?var str = "Hello world!";
? ? //查找"Hello"
? ? ?var a = /Hello/g;
? ? var result = a.test(str);
? ? console.log("返回值: " + result);
? ? //查找 "World"
? ? b = /World/g;
? ? result = b.test(str);
? ? console.log("返回值: " + result);
? ? 運(yùn)行結(jié)果:返回值: true
? ? ? ? ? ? ?返回值: false
常用正則表達(dá)式
? ? 1. Email地址:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
? ? 2. 域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?
? ? 3. InternetURL:[a-zA-z]+://[^\s]* 或 ^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$
? ? 4. 手機(jī)號(hào)碼:^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|16[2|5|6|7]|17[0|1|2|3|4|5|6|7|8]|18[0|1|2|3|5|6|7|8|9]|19[0|1|2|3|5|6|7|8|9])\d{8}$
? ? 5. 電話(huà)號(hào)碼("XXX-XXXXXXX"埃儿、"XXXX-XXXXXXXX"器仗、"XXX-XXXXXXX"、"XXX-XXXXXXXX"童番、"XXXXXXX"和"XXXXXXXX):^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$
? ? 6. 國(guó)內(nèi)電話(huà)號(hào)碼(0511-4405222精钮、021-87888822):\d{3}-\d{8}|\d{4}-\d{7}
? ? 7. 身份證號(hào)(15位、18位數(shù)字):^\d{15}|\d{18}$
? ? 8. 短身份證號(hào)碼(數(shù)字妓盲、字母x結(jié)尾):^([0-9]){7,18}(x|X)?$ 或 ^\d{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$
? ? 9. 帳號(hào)是否合法(字母開(kāi)頭杂拨,允許5-16字節(jié),允許字母數(shù)字下劃線(xiàn)):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
? ? 10. 密碼(以字母開(kāi)頭悯衬,長(zhǎng)度在6~18之間弹沽,只能包含字母、數(shù)字和下劃線(xiàn)):^[a-zA-Z]\w{5,17}$
? ? 11. 強(qiáng)密碼(必須包含大小寫(xiě)字母和數(shù)字的組合筋粗,不能使用特殊字符策橘,長(zhǎng)度在8-10之間):^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$
? ? 12. 日期格式:^\d{4}-\d{1,2}-\d{1,2}
? ? 13. 騰訊QQ號(hào):[1-9][0-9]{4,} (騰訊QQ號(hào)從10000開(kāi)始)
? ? 14. 中國(guó)郵政編碼:[1-9]\d{5}(?!\d) (中國(guó)郵政編碼為6位數(shù)字)
? ? 15. IP地址:\d+\.\d+\.\d+\.\d+ (提取IP地址時(shí)有用)
? ? 16. IP地址:((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))