說到JavaScript中的正則表達式,JavaScript程序員尤爲是新手都會有這麼一個印象:難!爲何這麼說,先上一個例子:javascript
regexp = /[a-z0-9!$%&'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!$%&'*+\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+(?:[A-Z]{2}|com|org|net|edu|gov|mil|biz|info|mobi|name|aero|asia|jobs|museum)\b/
天哪!這到底是什麼東西!眼尖的同窗可能已經掃到了其中的一個@符號,沒錯,這個正則表達式的做用就是用來匹配一個字符串中的email地址。看着這些讓人眼花繚亂的符號,相信不少人在內心已經開始打退堂鼓了(典型的80後句式,其實我到如今也沒弄清楚什麼是退堂鼓。哈哈哈哈。)。因而至關一部分同窗採起的態度就是,真正到了無可奈何要使用的時候,上度娘或者谷歌搜索例如「郵件地址正則表達式」等等,而後複製粘貼。ok,這種方法確實無可厚非,必須認可大部分時候搜索引擎就是幹這個活的。可是,咱們在現實項目中遇到的需求變幻無窮,你能保證每次都能順利搜索到想要的結果嗎?並且大部分搜索到的結果的更新日期都是幾年前,你看了以後不由有點發毛,內心已經開始嘀咕了:這真的能用嘛?固然咱們還有一個方法,在Stackoverflow等地方提問,等待別人回答,可是獲得回答的時間久不敢保證了。java
說了這麼多,主要就是說明一個事情:咱們須要本身掌握JavaScript中的正則表達式。其中的好處我就很少贅述了,可是升職加薪,當上CEO,迎娶白富美,成爲人森贏家都是頗有可能的。聽起來是否是有些小激動呢?先別忙着激動,先學會了正則表達式纔是一切的前提條件。程序員
一個正則表達式就是一個用來描述字符模式的對象,它被用來在文本中執行模式匹配(pattern-matching)以及」查找-替換」(search-and-replace)的任務。正則表達式
說的直白樸素一點,正則表達式就是咱們用來匹配一段特定字符串的東西。好比說咱們熟悉的email地址,若是有一個歷來沒見過email地址的人問你:「親,能給我描述一下郵件地址是怎麼樣的一個東西嘛?」你可能會說:「呃。。。首先有一串字符,它的長度不限,能夠是大寫字母、小寫字母、下劃線、連字符、數字。。。。中間是一個@符號,它必須存在。而後是一個表明郵件提供商的字符串,好比說gmail、16三、outlook。。。。最後是一個後綴,能夠是.com、.net等等等。。。。我說完了。」是否是感受好長,其實正則表達式就是幹了這麼一件事,好比說上面咱們看到的那個異常複雜的用來描述一個email地址的正則表達式,它就是用它本身語言來替代了咱們剛纔說的那一段話,而後JavaScript解釋器立刻理解了它的意思,而後開始幹活。如今回頭一想,正則表達式其實很是的簡潔且優美,整個表達過程沒有一句廢話,不像咱們說話的時候會加上許多相似「額,嗯,那個,這個,呵呵,麼麼噠」等口頭禪。可能這也是那些有代碼潔癖的程序員喜歡正則表達式的一個緣由吧。express
JavaScript中正則表達式的基本語法形式很是簡單,就像通常JavaScript中對象有字面量表示法和構造器函數法同樣,JavaScript中的正則表達式也有兩種寫法:函數
var part = new RegExp(pattern,modifiers);
這是常規寫法,其實就是用new生成了一個RegExp對象的實例而已,很好理解。其中的pattern就是正則表達式的主體,也就是咱們須要描述的模式,然後面的modifiers是什麼呢?它用來講明是否是須要進行全局搜索,大小寫敏感等等事項。對於通常的JavaScript對象,好比說函數,咱們通常不會採起構造器函數法。例如:學習
var myfunc = new Function([name],'alert("Hello" + name)');
可是正則表達式的這個構造器函數法咱們確常常須要使用,因此要記住。固然,咱們還有簡單的寫法:this
var patt = /pattern/modifiers;
前面已經提到了modifier,它主要用來指明模式是否對大小寫敏感以及是否全局搜索。搜索引擎
其中的i用來指明是否對大小寫敏感。spa
其中的g用來指明是否進行全局搜索。(即匹配全部符合模式的字符串而不是搜索到第一個就中止)
其中的m用來指明是否進行多行匹配。(即遇到轉義換行符\n是否還繼續搜索)
常常用到的是前面兩個i和g,m不是很經常使用。
下面是幾個例子:
var str = 'Visit W3School'; var patt1 = /w3school/i;
若是用patt1來匹配str,因爲咱們在patt1中指明瞭i,即對大小寫不敏感,所以只要str中包含w3school這一串字母,不管全是大寫,全是小寫,或者大小寫混合,均可以被匹配到。所以str中的W3School能被匹配到。
var str = "Is this all there is?"; var patt2 = /is/g;
若是用patt2來匹配str,因爲咱們在patt2中指明瞭g,即進行全局匹配,所以匹配不會在找到第一個匹配項目時就中止。在str中,咱們發現能匹配上的有兩個地方,一個是this中的is,另外一個是問號前面的is,而開頭的Is因爲第一個字母是大寫,而咱們的正則表達式並無指明對大小寫不敏感,所以不符合要求。
var str="Is this all there is?"; var patt3=/is/gi;
在patt3中咱們既指明瞭對大小寫不敏感,也指明瞭全局搜索,所以你可能已經猜到了,能匹配到的項目有IS,this中的is以及問號前面的is。
var str = "\nIs th\nis it?"; var patt4 = /^is/m;
在patt4中咱們指明瞭m,即換行匹配,而咱們在這裏看到了一個^符號,它表示匹配以is開頭的項目。咱們回到咱們字符串str中,因爲其中有轉移換行符\n,所以字符串真正的樣子應該是:
IS th
is it?
所以很明顯,咱們的patt4能夠匹配到第一行結束時尚未找到匹配項目,可是不會停下,繼續第二行的匹配,所以就匹配到了第二行中的is,它也是以is開頭的字符串,符合要求。
JavaScript中正則表達式對象一共有4個方法。
1.compile()。它將編譯一個正則表達式。該方法已經在JavaScript version 1.5中被棄用。
2.exec()。該方法將對一個字符串進行匹配。並返回第一個匹配項目。例如:
var patt1=new RegExp("e");
patt1.exec("The best things in life are free");
結果將返回e,即第一個匹配到的項目。
3.test()。該方法對一個字符串進行匹配。並根據匹配結果返回true或false。例如:
var patt1=new RegExp("e"); patt1.test("The best things in life are free");
結果將返回true。由於字符串中含有能匹配上的項目e。
4.toString()。該方法將正則表達式對象轉換爲一個字符串。例如:
var patt = new RegExp("Hello World","g"); patt.toString();
結果將返回一個字符串’/Hello World/g’。
以上就是正則表達式最簡單的知識,在學習完這個系列以後,我相信你必定能狗看懂最開始的那個嚇人的正則表達式,而且可以寫出更復雜的正則表達式。千里之行始於足下,正則高手也是從正則菜鳥開始的。