正則表達(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)是用來(lái)干什么的呢,它是用來(lái)匹配位置的
- ^:起始位置
/^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é)過(guò)錨點(diǎn)了之后,我們?cè)賮?lái)看最初的那個(gè)問(wèn)題,我們可以把它改成下面的正則語(yǔ)句,然后測(cè)試那個(gè)剛才讓我們不是很滿意的問(wèn)題。
/^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)——”字符類(lèi)“
字符類(lèi)
字符類(lèi)是什么呢,是匹配一類(lèi)字符中的一個(gè)。
- [abc]:a或b或c;
- [0-9]:一個(gè)數(shù)字; [^0-9]:非數(shù)字的一個(gè)字符;
- [a-z]:一個(gè)字母;
- .:任一字符(換行除外);
學(xué)了字符類(lèi)以后呢,我們就可以把我們最初的正則表達(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
但是問(wèn)題又來(lái)了,我們會(huì)不會(huì)覺(jué)得這[0-9]寫(xiě)的太長(zhǎng)了,能不能簡(jiǎn)寫(xiě)呢,這個(gè)問(wèn)題的解決方法,我們就要用到正則表達(dá)式的第三個(gè)知識(shí)點(diǎn)——元字符。
元字符
元字符是什么呢,是具有特殊意義的字符。
其實(shí)我們上面已經(jīng)介紹過(guò)一些元字符了,比如:
- ^、$、\b
另外還有一些元字符:
\d:[0-9];\D:[^\d];
\s:空白符;\S:[^\s]表示非空白符;
\w:[A-Za-z0-9_];\W:[^\w]
有了元字符,我們?cè)賮?lái)改良下我們的這個(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
那么問(wèn)題又來(lái)了,這個(gè)改良過(guò)的正則表達(dá)式,還是不夠簡(jiǎn)練,里面有10個(gè)\b,怎么樣寫(xiě)的更加簡(jiǎn)練些呢,這個(gè)時(shí)候我們就要用到第四個(gè)知識(shí)點(diǎn)——量詞。
量詞
什么是量詞呢,就是出現(xiàn)的次數(shù)。
{m,n}:m到n次
*:{0,}表示出現(xiàn)0次到無(wú)窮次
?:{0,1}表示出現(xiàn)0次到1次
+:{1,}表示出現(xiàn)1次到 無(wú)窮次
看栗子
/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è)賮?lái)看看,正則表達(dá)式中還有哪些知識(shí)點(diǎn)需要講。
轉(zhuǎn)義符
什么是轉(zhuǎn)義符,就是需要匹配的字符是元字符。比如:
/^http:\/\//
/@163\.com$/
接下來(lái)再看一個(gè)需求,比如我們想要匹配網(wǎng)易的郵箱,但是比如別的郵箱都是報(bào)false的,這個(gè)怎么處理呢。網(wǎng)易郵箱有@126.com|@163.com|@188.com這幾種。
要怎么寫(xiě)呢,做這個(gè)需求的時(shí)候,我們就要用到正則表達(dá)式中另一個(gè)知識(shí)點(diǎn)——多選分支。
/thi(c|n)k/===/thi[cn]k/
/\.(png|jpg|jpeg|gif)$/
照著上面的模樣,我們可以試試怎么寫(xiě)匹配網(wǎng)易郵箱的正則表達(dá)式。
/(.+)@(126|163|188)\.com$/
下面要說(shuō)的一個(gè)復(fù)雜的實(shí)例:
假如我們要在這上面的地址的地方,獲取它子串的內(nèi)容,要怎么辦呢,這就要用到正則表達(dá)式,又一個(gè)知識(shí)點(diǎn)——捕獲、
捕獲
捕獲要做的事情呢,就是保存匹配到的字符串,日后再用。那么捕獲的語(yǔ)法呢:
- ():捕獲
- (?:):不捕獲
比如上面的例子中有用到()的:
/(.+)@(126|163|188)\.com$/
捕獲的東西就會(huì)放在()中,那么要怎么使用捕獲到的東西呢?
str.match(regexp);
用這個(gè)來(lái)獲取匹配的字符串。
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];
再來(lái)看下一個(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");