正則表達(dá)式RegExp
兩種方式:
/pattern/attrs
new RegExp(pattern,attrs)
regexObj.test(str)
測(cè)試正則表達(dá)式與指定字符串是否匹配
/13566668888/.test("1356666888"); //false
/13566668888/.test("13566668888"); //true
/13566668888/.test("x1356666888y"); //true
第三個(gè)也是true的补胚,不是我們希望的绳矩,那要怎么辦呢灵份。
就要用到”錨點(diǎn)“
錨點(diǎn)
錨點(diǎn)是用來干什么的呢,它是用來匹配位置的
- ^:起始位置
/^http:/.test("http://www.163.com"); //true
/^http:/.test("ahttp://www.163.com"); //false
- $:結(jié)尾位置
/\.jpg$/.test("1.jpg"); //true
/\.jpg$/.test("1.jpga"); //false
- \b:?jiǎn)卧~邊界
/\bis\b/.test("this"); //false
/\bis\b/.test("this is tom"); //true
學(xué)過錨點(diǎn)了之后阶捆,我們?cè)賮砜醋畛醯哪莻€(gè)問題拓春,我們可以把它改成下面的正則語句释簿,然后測(cè)試那個(gè)剛才讓我們不是很滿意的問題。
/^13566668888$/
/^13566668888$/.test("x13566668888y"); //false
/^13566668888$/.test("13566668888"); //true
但是呢痘儡,我們比如做個(gè)下面的測(cè)試:
···
/^13566668888$/.test("13512345678"); //false
···
這個(gè)結(jié)果顯然也不是我們想要的辕万,我們想要的結(jié)果是做一個(gè)通用的手機(jī)號(hào)碼測(cè)試的正則表達(dá)式,那這個(gè)怎么辦呢沉删,就需要用到第二個(gè)我們要講的知識(shí)點(diǎn)——”字符類“
字符類
字符類是什么呢渐尿,是匹配一類字符中的一個(gè)。
- [abc]:a或b或c矾瑰;
- [0-9]:一個(gè)數(shù)字砖茸; [^0-9]:非數(shù)字的一個(gè)字符;
- [a-z]:一個(gè)字母殴穴;
- .:任一字符(換行除外)凉夯;
學(xué)了字符類以后呢,我們就可以把我們最初的正則表達(dá)式再重新調(diào)整下采幌,然后測(cè)試下能不能測(cè)試通用的手機(jī)號(hào)碼劲够。
/^1[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]$/
/^1[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]$/.test("13512345678"); //true
但是問題又來了,我們會(huì)不會(huì)覺得這[0-9]寫的太長(zhǎng)了休傍,能不能簡(jiǎn)寫呢征绎,這個(gè)問題的解決方法,我們就要用到正則表達(dá)式的第三個(gè)知識(shí)點(diǎn)——元字符磨取。
元字符
元字符是什么呢人柿,是具有特殊意義的字符柴墩。
其實(shí)我們上面已經(jīng)介紹過一些元字符了,比如:
- ^凫岖、$江咳、\b
另外還有一些元字符:
\d:[0-9];\D:[^\d]哥放;
\s:空白符歼指;\S:[^\s]表示非空白符;
\w:[A-Za-z0-9_]婶芭;\W:[^\w]
有了元字符东臀,我們?cè)賮砀牧枷挛覀兊倪@個(gè)正則表達(dá)式着饥。
/^1\d\d\d\d\d\d\d\d\d\d$/
/^1\d\d\d\d\d\d\d\d\d\d$/.test("13512345678"); //true
那么問題又來了犀农,這個(gè)改良過的正則表達(dá)式,還是不夠簡(jiǎn)練宰掉,里面有10個(gè)\b呵哨,怎么樣寫的更加簡(jiǎn)練些呢,這個(gè)時(shí)候我們就要用到第四個(gè)知識(shí)點(diǎn)——量詞轨奄。
量詞
什么是量詞呢孟害,就是出現(xiàn)的次數(shù)。
{m,n}:m到n次
*:{0,}表示出現(xiàn)0次到無窮次
挪拟?:{0,1}表示出現(xiàn)0次到1次
+:{1,}表示出現(xiàn)1次到 無窮次
看栗子
/https?:/.test("http://www.163.com"); //true
/https?:/.test("https://www.163.com"); //true
/https?:/.test("httpss://www.163.com"); //true
現(xiàn)在挨务,有了這個(gè)量詞以后,我們的匹配手機(jī)號(hào)碼的表達(dá)式也可以調(diào)整改良下玉组。
/^1\d{10}$/
/^1\d{10}$/.test("13512345678"); //true
講完了匹配手機(jī)號(hào)碼的正則表達(dá)式谎柄,我們?cè)賮砜纯矗齽t表達(dá)式中還有哪些知識(shí)點(diǎn)需要講惯雳。
轉(zhuǎn)義符
什么是轉(zhuǎn)義符朝巫,就是需要匹配的字符是元字符。比如:
/^http:\/\//
/@163\.com$/
接下來再看一個(gè)需求石景,比如我們想要匹配網(wǎng)易的郵箱劈猿,但是比如別的郵箱都是報(bào)false的,這個(gè)怎么處理呢潮孽。網(wǎng)易郵箱有@126.com|@163.com|@188.com這幾種揪荣。
要怎么寫呢,做這個(gè)需求的時(shí)候往史,我們就要用到正則表達(dá)式中另一個(gè)知識(shí)點(diǎn)——多選分支仗颈。
/thi(c|n)k/===/thi[cn]k/
/\.(png|jpg|jpeg|gif)$/
照著上面的模樣,我們可以試試怎么寫匹配網(wǎng)易郵箱的正則表達(dá)式怠堪。
/(.+)@(126|163|188)\.com$/
下面要說的一個(gè)復(fù)雜的實(shí)例:
假如我們要在這上面的地址的地方揽乱,獲取它子串的內(nèi)容名眉,要怎么辦呢,這就要用到正則表達(dá)式凰棉,又一個(gè)知識(shí)點(diǎn)——捕獲损拢、
捕獲
捕獲要做的事情呢,就是保存匹配到的字符串撒犀,日后再用福压。那么捕獲的語法呢:
- ():捕獲
- (?:):不捕獲
比如上面的例子中有用到()的:
/(.+)@(126|163|188)\.com$/
捕獲的東西就會(huì)放在()中或舞,那么要怎么使用捕獲到的東西呢荆姆?
str.match(regexp);
用這個(gè)來獲取匹配的字符串。
var url="http://blog.163.com/album?id=1#comment";
var reg=/^(https?:)\/\/(^\/)+(\/[^\?]*)?(\?[^#]*)?(#.*)?$/;
var arr= url.match(reg);
var protocol=arr[1];
var host=arr[2];
var pathname=arr[3];
var search=arr[4];
var hash=arr[5];
再來看下一個(gè)需求:
要把5替換成5.00的價(jià)格形式的映凳,怎么替換呢胆筒,就要用到下面的一個(gè)方法:
str.replace(regexp/substr,replacement)
看實(shí)例代碼:
var str="the price of tomato is 5,the price of apple is 10.";
str.replace(/(\d+)/g,"$1.00");