前言
正則表達(dá)式(regular expression)描述了一種字符串匹配的模式,可以用來(lái)檢查一個(gè)串是否含有某種子串、將匹配的子串做替換或者從某個(gè)串中取出符合某個(gè)條件的子串等。正則表達(dá)式是由普通字符(例如字符 a 到 z)以及特殊字符(稱為"元字符")組成的文字模式。模式描述在搜索文本時(shí)要匹配的一個(gè)或多個(gè)字符串。正則表達(dá)式作為一個(gè)模板,將某個(gè)字符模式與所搜索的字符串進(jìn)行匹配。
為啥要有正則表達(dá)式呢?其實(shí)就是因?yàn)橛?jì)算機(jī)笨(這話不是我說(shuō)的),比如123456@qq.com我們一看就是郵箱,可是計(jì)算機(jī)不認(rèn)識(shí)啊,所以我們就要用一些計(jì)算機(jī)認(rèn)識(shí)的語(yǔ)言,來(lái)制定好規(guī)則,告訴它符合這個(gè)規(guī)則的就是個(gè)郵箱,這樣計(jì)算機(jī)就能幫我們找到對(duì)應(yīng)的東西了。所以正則就是用來(lái)設(shè)置規(guī)則,來(lái)完成我們需求的一些操作的,比如登錄驗(yàn)證啦,搜索指定的東西啦等等,說(shuō)太多都是多余,直接看正題吧。
定義正則:
var re = new RegExp(“a”);? //RegExp對(duì)象。參數(shù)就是我們想要制定的規(guī)則。有一種情況必須用這種方式,下面會(huì)提到。
var re = /a/;?? // 簡(jiǎn)寫方法 推薦使用 性能更好? 不能為空 不然以為是注釋 ,
正則的常用方法
1? test()? :在字符串中查找符合正則的內(nèi)容,若查找到返回true,反之返回false.
用法:正則.test(字符串)
例子:判斷是否是數(shù)字
var str = '374829348791'; var re = /\D/; // \D代表非數(shù)字 if( re.test(str) ){ // 返回true,代表在字符串中找到了非數(shù)字。 alert('不全是數(shù)字'); }else{ alert('全是數(shù)字'); }
正則表達(dá)式中有很多符號(hào),代表著不同的意思,用來(lái)讓我們?nèi)ザx不同的規(guī)則,比如上面\D,還有下面的這些:
\s : 空格
\S : 非空格
\d : 數(shù)字
\D : 非數(shù)字
\w : 字符 ( 字母 ,數(shù)字,下劃線_ )
\W : 非字符例子:是否有不是數(shù)字的字符
(下面會(huì)根據(jù)例子,依次講一些常用的字符,最后再作總結(jié)。)
2 search() :在字符串搜索符合正則的內(nèi)容,搜索到就返回出現(xiàn)的位置(從0開(kāi)始,如果匹配的不只是一個(gè)字母,那只會(huì)返回第一個(gè)字母的位置), 如果搜索失敗就返回 -1
用法:字符串.search(正則)
在字符串中查找復(fù)合正則的內(nèi)容。忽略大小寫:i——ignore(正則中默認(rèn)是區(qū)分大小寫的 如果不區(qū)分大小寫的話,在正則的最后加標(biāo)識(shí) i )
例子:在字符串中找字母b,且不區(qū)分大小寫
var str = 'abcdef'; var re = /B/i; //var re = new RegExp('B','i'); 也可以這樣寫 alert( str.search(re) ); // 1
3 match() 在字符串中搜索復(fù)合規(guī)則的內(nèi)容,搜索成功就返回內(nèi)容,格式為數(shù)組,失敗就返回null。
用法: 字符串.match(正則)
量詞:+ 至少出現(xiàn)一次 匹配不確定的次數(shù)(匹配就是搜索查找的意思)
全局匹配:g——global(正則中默認(rèn),只要搜索到復(fù)合規(guī)則的內(nèi)容就會(huì)結(jié)束搜索 )
例子:找出指定格式的所有數(shù)字,如下找到 123,54,33,879
var str = 'haj123sdk54hask33dkhalsd879'; var re = /\d+/g; // 每次匹配至少一個(gè)數(shù)字 且全局匹配 如果不是全局匹配,當(dāng)找到數(shù)字123,它就會(huì)停止了。就只會(huì)彈出123.加上全局匹配,就會(huì)從開(kāi)始到結(jié)束一直去搜索符合規(guī)則的。如果沒(méi)有加號(hào),匹配的結(jié)果就是1,2,3,5,4,3,3,8,7,9并不是我們想要的,有了加號(hào),每次匹配的數(shù)字就是至少一個(gè)了。 alert( str.match(re) ); // [123,54,33,879]
4 replace() :查找符合正則的字符串,就替換成對(duì)應(yīng)的字符串。返回替換后的內(nèi)容。
用法: 字符串.replace(正則,新的字符串/回調(diào)函數(shù))(在回調(diào)函數(shù)中,第一個(gè)參數(shù)指的是每次匹配成功的字符)
| : 或的意思 。
例子:敏感詞過(guò)濾,比如 我愛(ài)北京天安門,天安門上太陽(yáng)升。------我愛(ài)*****,****上太陽(yáng)升。即北京和天安門變成*號(hào),
一開(kāi)始我們可能會(huì)想到這樣的方法:
var str = "我愛(ài)北京天安門,天安門上太陽(yáng)升。"; var re = /北京|天安門/g; // 找到北京 或者天安門 全局匹配 var str2 = str.replace(re,'*'); alert(str2) //我愛(ài)**,*上太陽(yáng)升 //這種只是把找到的變成了一個(gè)*,并不能幾個(gè)字就對(duì)應(yīng)幾個(gè)*。
要想實(shí)現(xiàn)幾個(gè)字對(duì)應(yīng)幾個(gè)*,我們可以用回調(diào)函數(shù)實(shí)現(xiàn):
var str = "我愛(ài)北京天安門,天安門上太陽(yáng)升。"; var re = /北京|天安門/g; // 找到北京 或者天安門 全局匹配 var str2 = str.replace(re,function(str){ alert(str); //用來(lái)測(cè)試:函數(shù)的第一個(gè)參數(shù)代表每次搜索到的符合正則的字符,所以第一次str指的是北京 第二次str是天安門 第三次str是天安門 var result = ''; for(var i=0;i<str.length;i++){ result += '*'; } return result; //所以搜索到了幾個(gè)字就返回幾個(gè)* }); alert(str2) //我愛(ài)*****,***上太陽(yáng)升 //整個(gè)過(guò)程就是,找到北京,替換成了兩個(gè)*,找到天安門替換成了3個(gè)*,找到天安門替換成3個(gè)*。
replace是一個(gè)很有用的方法,經(jīng)常會(huì)用到。
正則中的字符
():,小括號(hào),叫做分組符。就相當(dāng)于數(shù)學(xué)里面的括號(hào)。如下:
var str = '2013-6-7'; var re1 = /\d-+/g; // 全局匹配數(shù)字,橫杠,橫杠數(shù)量至少為1,匹配結(jié)果為: 3- 6- var re1 = /(\d-)+/g; // 全局匹配數(shù)字,橫杠,數(shù)字和橫杠整體數(shù)量至少為1 3-6- var re2 = /(\d+)(-)/g; // 全局匹配至少一個(gè)數(shù)字,匹配一個(gè)橫杠 匹配結(jié)果:2013- 6-
同時(shí),正則中的每一個(gè)帶小括號(hào)的項(xiàng),都叫做這個(gè)正則的子項(xiàng)。子項(xiàng)在某些時(shí)候非常的有用,比如我們來(lái)看一個(gè)栗子。
例子:讓2013-6-7 變成 2013.6.7
var str = '2013-6-7'; var re = /(\d+)(-)/g; str = str.replace(re,function($0,$1,$2){ //replace()中如果有子項(xiàng), //第一個(gè)參數(shù):$0(匹配成功后的整體結(jié)果 2013- 6-), // 第二個(gè)參數(shù) : $1(匹配成功的第一個(gè)分組,這里指的是\d 2013, 6) //第三個(gè)參數(shù) : $1(匹配成功的第二個(gè)分組,這里指的是- - - ) return $1 + '.'; //分別返回2013. 6. }); alert( str ); //2013.6.7 //整個(gè)過(guò)程就是利用子項(xiàng)把2013- 6- 分別替換成了2013. 6. 最終彈出2013.6.7
match方法也會(huì)返回自己的子項(xiàng),如下:
var str = 'abc'; var re = /(a)(b)(c)/; alert( str.match(re) ); //[abc,a,b,c]( 返回的是匹配結(jié)果 以及每個(gè)子項(xiàng) 當(dāng)match不加g的時(shí)候才可以獲取到子項(xiàng)的集合)
補(bǔ)充:exec()方法:和match方法一樣,搜索符合規(guī)則的內(nèi)容,并返回內(nèi)容,格式為數(shù)組。
用法:正則.exec(字符串);
屬性:input(代表要匹配的字符串)
栗子:不是全局匹配的情況:
var testStr = "now test001 test002"; var re = /test(\d+)/; //只匹配一次 var r = ""; var r = re.exec(testStr) alert(r);// test001 001 返回匹配結(jié)果,以及子項(xiàng) alert(r.length); //2 返回內(nèi)容的長(zhǎng)度 alert(r.input); //now test001 test002 代表每次匹配成功的字符串 alert(r[0]); //test001 alert(r[1]); //001 代表每次匹配成功字符串中的第一個(gè)子項(xiàng) (\d+) alert(r.index ); // 4 每次匹配成功的字符串中的第一個(gè)字符的位置
全局匹配:如果是全局匹配,可以通過(guò)while循環(huán) 找到每次匹配到的字符串,以及子項(xiàng)。每次匹配都接著上次的位置開(kāi)始匹配
var testStr = "now test001 test002"; var re = /test(\d+)/g; var r = ""; //匹配兩次 每次匹配都接著上一次的位置開(kāi)始匹配,一直匹配到最后r就為false,就停止匹配了 匹配到test001 test002 while(r = re.exec(testStr)){ alert(r);//返回每次匹配成功的字符串,以及子項(xiàng),分別彈出 :test001 001,test002 002 alert(r.input); //分別彈出: now test001 test002 now test001 test002 alert(r[0]); //代表每次匹配成功的字符串 分別彈出: test001 test002 alert(r[1]); //代表每次匹配成功字符串中的第一個(gè)子項(xiàng) (\d+) 分別彈出:001 002 alert(r.index ); // 每次匹配成功的字符串中的第一個(gè)字符的位置,分別彈出:4 12 alert(r.length); //分別彈出:2 2 }
[] : 表示某個(gè)集合中的任意一個(gè),比如 [abc] 整體代表一個(gè)字符 匹配 a b c 中的任意一個(gè),也可以是范圍,[0-9] 范圍必須從小到大 。
[^a] 整體代表一個(gè)字符 :^寫在[]里面的話,就代表排除的意思
例子:匹配HTML標(biāo)簽 比如
var re = /<[^>]+>/g; //匹配左括號(hào) 中間至少一個(gè)非右括號(hào)的內(nèi)容(因?yàn)闃?biāo)簽里面還有屬性等一些東西),然后匹配右括號(hào) var re = /<[\w\W]+>/g; //匹配左括號(hào) 中間至少一個(gè)字符或者非字符的內(nèi)容,然后匹配右括號(hào) // 其實(shí)就是找到左括號(hào),然后中間可以有至少一個(gè)內(nèi)容,一直到找到右括號(hào)就代表是一個(gè)標(biāo)簽。
轉(zhuǎn)義字符
\s : 空格
\S : 非空格
\d : 數(shù)字
\D : 非數(shù)字
\w : 字符 ( 字母 ,數(shù)字,下劃線_ )
\W : 非字符
.(點(diǎn))——任意字符
\. : 真正的點(diǎn)
\b : 獨(dú)立的部分 ( 起始,結(jié)束,空格 )
\B : 非獨(dú)立的部分
關(guān)于最后兩個(gè)來(lái)看個(gè)栗子:
var str = 'onetwo'; var str2 ="one two"; var re = /one\b/; // e后面必須是獨(dú)立的 可以是起始,空格,或結(jié)束 alert( re.test(str) ); //false alert( re.test(str2) );//true
例子:寫一個(gè)用class名獲取節(jié)點(diǎn)的函數(shù):
我們之前可能見(jiàn)過(guò)這樣的函數(shù)
function getByClass(parent,classname){ if(parent.getElementsByClassName){ return parent.getElementsByClassName(classname); } else{ var results = new Array();//用來(lái)存儲(chǔ)所有取到的class為box的元素 var elems = parent.getElementsByTagName("*"); for(var i =0;i<elems.length;i++){ if(elems[i].className==classname){ results.push(elems[i]); } } return results; } }
其實(shí)這是存在問(wèn)題的,比如它如果一個(gè)標(biāo)簽里面有兩個(gè)class,或者存在相同名字的class,比如

Hot AI Tools

Undress AI Tool
Undress images for free

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)