![JavaScript 正則表達式基本語法_第1頁](http://file4.renrendoc.com/view12/M03/38/1C/wKhkGWccRsOAMOtTAAFKSDvlA3A108.jpg)
![JavaScript 正則表達式基本語法_第2頁](http://file4.renrendoc.com/view12/M03/38/1C/wKhkGWccRsOAMOtTAAFKSDvlA3A1082.jpg)
![JavaScript 正則表達式基本語法_第3頁](http://file4.renrendoc.com/view12/M03/38/1C/wKhkGWccRsOAMOtTAAFKSDvlA3A1083.jpg)
![JavaScript 正則表達式基本語法_第4頁](http://file4.renrendoc.com/view12/M03/38/1C/wKhkGWccRsOAMOtTAAFKSDvlA3A1084.jpg)
![JavaScript 正則表達式基本語法_第5頁](http://file4.renrendoc.com/view12/M03/38/1C/wKhkGWccRsOAMOtTAAFKSDvlA3A1085.jpg)
版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
JavaScript正則表達式上——基本語法定義JavaScript種正則表達式有兩種定義方式,定義一個匹配類似
<%XXX%>
的字符串1.構造函數(shù)varreg=newRegExp('<%[^%>]+%>','g');2.字面量varreg=/<%[^%>]%>/g;g:
global,全文搜索,默認搜索到第一個結果接停止i:
ingorecase,忽略大小寫,默認大小寫敏感m:
multiplelines,多行搜索元字符正則表達式讓人望而卻步以一個重要原因就是其轉義字符太多了,組合非常之多,但是正則表達式的元字符(在正則表達式中具有特殊意義的專用字符,可以用來規(guī)定其前導字符)并不多元字符:([{\^$|)?*+.并不是每個元字符都有其特定意義,在不同的組合中元字符有不同的意義,分類看一下預定義特殊字符字符含義\t水平制表符\r回車符\n換行符\f換頁符\cX與X對應的控制字符(Ctrl+X)\v垂直制表符\0空字符
字符類一般情況下正則表達式一個字符(轉義字符算一個)對應字符串一個字符,表達式
ab\t
的含義是但是我們可以使用元字符[]來構建一個簡單的類,所謂類是指,符合某些特征的對象,是一個泛指,而不是特指某個字符了,我們可以使用表達式[abc]把字符a或b或c歸為一類,表達式可以匹配這類的字符元字符[]組合可以創(chuàng)建一個類,我們還可以使用元字符^創(chuàng)建反向類/負向類,反向類的意思是不屬于XXX類的內(nèi)容,表達式
[^abc]
表示不是字符a或b或c的內(nèi)容范圍類按照上面的說明要是我們希望匹配單個數(shù)字那么表達式是這樣的[0123456789]如果是字母那么。。。,好麻煩,正則表達式還提供了范圍類,我們可以使用x-y來連接兩個字符表示從x到y(tǒng)的任意字符,這是個閉區(qū)間,也就是說包含x和ybenshen,這樣匹配小寫字母就很簡單了[a-z]要是想匹配所有字母呢?在[]組成的類內(nèi)部是可以連寫的,我們還可以這樣寫
[a-zA-Z]預定義類剛才使用正則我們創(chuàng)建了幾個類,來表示數(shù)字,字母等,但這樣寫也很是麻煩,正則表達式為我們提供了幾個常用的預定義類來匹配常見的字符字符等價類含義.[^\n\r]除了回車符和換行符之外的所有字符\d[0-9]數(shù)字字符\D[^0-9]非數(shù)字字符\s[\t\n\x0B\f\r]空白符\S[^\t\n\x0B\f\r]非空白符\w[a-zA-Z_0-9]單詞字符(字母、數(shù)字、下劃線)\W[^a-zA-Z_0-9]非單詞字符
有了這些預定義類,寫一些正則就很方便了,比如我們希望匹配一個ab+數(shù)字+任意字符的字符串,就可以這樣寫了
ab\d.
邊界正則表達式還提供了幾個常用的邊界匹配字符字符含義^以xx開頭$以xx結尾\b單詞邊界,指[a-zA-Z_0-9]之外的字符\B非單詞邊界
看個不負責任的郵箱正則匹配(切勿模仿,小括號后面會講到)
\w+@\w+\.(com)$量詞之前我們介紹的方法都是一一匹配的,如果我們希望匹配一個連續(xù)出現(xiàn)20次數(shù)字的字符串難道我們需要寫成這樣\d\d\d\d...為此正則表達式引入了一些量詞字符含義?出現(xiàn)零次或一次(最多出現(xiàn)一次)+出現(xiàn)一次或多次(至少出現(xiàn)一次)*出現(xiàn)零次或多次(任意次){n}出現(xiàn)n次{n,m}出現(xiàn)n到m次{n,}至少出現(xiàn)n次{,m}最多出現(xiàn)m次
看幾個使用量詞的例子\w+\bByron
匹配單詞+邊界+Byron(/\w+\bByron).test('HiByron');//true(/\w+\bByron).test('WelcomeByron');//true(/\w+\bByron).test('Byron');//false
\d+\.\d{1,3}
匹配三位小數(shù)的數(shù)字
貪婪模式與非貪婪模式看了上面介紹的量詞,也許愛思考的同學會想到關于匹配原則的一些問題,比如{3,5}這個量詞,要是在句子種出現(xiàn)了十次,那么他是每次匹配三個還是五個,反正3、4、5都滿足3~5的條件,量詞在默認下是盡可能多的匹配的,也就是大家常說的貪婪模式'123456789'.match(/\d{3,5}/g);//["12345","6789"]
既然有貪婪模式,那么肯定會有非貪婪模式,讓正則表達式盡可能少的匹配,也就是說一旦成功匹配不不再繼續(xù)嘗試,做法很簡單,在量詞后加上?即可'123456789'.match(/\d{3,5}?/g);//["123","456","789"]
分組有時候我們希望使用量詞的時候匹配多個字符,而不是像上面例子只是匹配一個,比如希望匹配Byron出現(xiàn)20次的字符串,我們?nèi)绻麑懗?/p>
Byron{20}
的話匹配的是Byro+n出現(xiàn)20次,怎么把Byron作為一個整體呢?使用()就可以達到次目的,我們稱為分組(Byron){20}
如果希望匹配Byron或Casper出現(xiàn)20次該怎么辦呢?可以使用字符|達到或的功效(Byron|Casper){20}
我們看到圖中有個#1的東東,那是什么?使用分組的正則表達式會把匹配項也放到分組中,默認就是按數(shù)字編號分發(fā)的,各異根據(jù)編號獲得捕獲的分組內(nèi)容,這個在一些希望具體操作第幾個匹配項的函數(shù)中很有用(Byron).(ok)
如果有分組嵌套的情況,外面的組的編號靠前((^|%>)[^\t]*)
有時候我們不希望捕獲某些分組,只需要在分組內(nèi)加上?:就可以了,著并不意味著該分組內(nèi)容不屬于正則表達式,只是不會給這個分組加編號了而已(?:Byron).(ok)
其實在C#等語言中分組還可以起名字,不過JavaScript不支持前瞻表達式含義exp1(?=exp2)匹配后面是exp2的exp1exp1(?!exp2)匹配后面不是exp2的exp1
說的有些抽象,看個例子
good(?=Byron)(/good(?=Byron)/).exec('goodByron123');//['good'](/good(?=Byron)/).exec('goodCasper123');//null(/bad(?=Byron)/).exec('goodCasper123');//null通過上面例子可以看出exp1(?=exp2)表達式會匹配exp1表達式,但只有其后面內(nèi)容是exp2的時候才會匹配,也就是兩個條件,exp1(?!exp2)比較類似good(?!Byron)(/good(?!Byron)/).exec('goodByron123');//null(/good(?!Byron)/).exec('goodCasper123');//['good'](/bad(?!Byron)/).exec('goodCasper123');//null參考
司徒正美
JavaScript正則表達式篇博客JavaScript正則表達式上——基本語法介紹了JavaScript正則表達式的語法,有了這些基本知識,可以看看正則表達式在JavaScript的應用了,在一切開始之前,看看RegExp實例的幾個屬性
RegExp實例對象有五個屬性global:是否全局搜索,默認是falseignoreCase:是否大小寫敏感,默認是falsemultiline:多行搜索,默認值是falselastIndex:是當前表達式模式首次匹配內(nèi)容中最后一個字符的下一個位置,每次正則表達式成功匹配時,lastIndex屬性值都會隨之改變。source:正則表達式的文本字符串
除了將正則表達式編譯為內(nèi)部格式從而使執(zhí)行更快的compile()方法,對象還有兩個我們常用的方法regObj.test(strObj)方法用于測試字符串參數(shù)中是否存正則表達式模式,如果存在則返回true,否則返回falsevarreg=/\d+\.\d{1,2}$/g;reg.test('123.45');//truereg.test('0.2');//truereg.test('a.34');//falsereg.test('34.5678');//falseregObj.exec(strObj)方法用于正則表達式模式在字符串中運行查找,如果exec()找到了匹配的文本,則返回一個結果數(shù)組。否則,返回null。除了數(shù)組元素和length屬性之外,exec()方法還返回兩個屬性。index屬性聲明的是匹配文本的第一個字符的位置。input屬性則存放的是被檢索的字符串string。調(diào)用非全局的RegExp對象的exec()時,返回數(shù)組的第0個元素是與正則表達式相匹配的文本,第1個元素是與RegExpObject的第1個子表達式相匹配的文本(如果有的話),第2個元素是與RegExp對象的第2個子表達式相匹配的文本(如果有的話),以此類推。調(diào)用全局的RegExp對象的exec()
時,它會在RegExp實例的lastIndex屬性指定的字符處開始檢索字符串string。當exec()找到了與表達式相匹配的文本時,在匹配后,它將把RegExp實例的lastIndex屬性設置為匹配文本的最后一個字符的下一個位置。可以通過反復調(diào)用exec()方法來遍歷字符串中的所有匹配文本。當exec()再也找不到匹配的文本時,它將返回null,并把lastIndex屬性重置為0。varreg=/\d/g;varr=reg.exec('a1b2c3');console.log(reg.lastIndex);//2r=reg.exec('a1b2c3');console.log(reg.lastIndex);//4兩次執(zhí)行r的結果
varreg=/\d/g;while(r=reg.exec('a1b2c3')){console.log(r.index+':'+r[0]);}可以看到結果:1:13:25:3除了上面的兩個方法,有些字符串函數(shù)可以傳入RegExp對象作為參數(shù),進行一些復雜的操作strObj.search(RegObj)search()方法用于檢索字符串中指定的子字符串,或檢索與正則表達式相匹配的子字符串。search()方法不執(zhí)行全局匹配,它將忽略標志g。它同時忽略regexp的lastIndex屬性,并且總是從字符串的開始進行檢索,這意味著它總是返回stringObject的第一個匹配的位置。'a1b2c3'.search(/\d/g);//1'a1b2c3'.search(/\d/);//1strObj.match(RegObj)match()方法將檢索字符串stringObject,以找到一個或多個與regexp匹配的文本。但regexp是否具有標志g對結果影響很大。如果regexp沒有標志g,那么match()方法就只能在strObj中執(zhí)行一次匹配。如果沒有找到任何匹配的文本,match()將返回null。否則,它將返回一個數(shù)組,其中存放了與它找到的匹配文本有關的信息。該數(shù)組的第0個元素存放的是匹配文本,而其余的元素存放的是與正則表達式的子表達式匹配的文本。除了這些常規(guī)的數(shù)組元素之外,返回的數(shù)組還含有兩個對象屬性。index屬性聲明的是匹配文本的起始字符在stringObject中的位置,input屬性聲明的是對stringObject的引用。varr='aaa123456'.match(/\d/);如果regexp具有標志g,則match()方法將執(zhí)行全局檢索,找到strObj中的所有匹配子字符串。若沒有找到任何匹配的子串,則返回null。如果找到了一個或多個匹配子串,則返回一個數(shù)組。不過全局匹配返回的數(shù)組的內(nèi)容與前者大不相同,它的數(shù)組元素中存放的是strObj中所有的匹配子串,而且也沒有index屬性或input屬性。varr='aaa123456'.match(/\d/g);strObj.replace(regObj,replaceStr)關于strng對象的replace方法,我們最常用的時傳入兩個字符串的做法,但這種做法有個缺陷,只能replace一次'abcabcabc'.replace('bc','X');//aXabcabcreplace方法的第一個參數(shù)還可以傳入RegExp對象,傳入正則表達式可以時replace方法更加強大靈活'abcabcabc'.replace(/bc/g,'X');//aXaXaX'abcaBcabC'.replace(/bc/gi,'X');//aXaXaX如果replace方法的第一個參數(shù)傳入的是帶分組的正則表達式,我們在第二個參數(shù)中可以使用$1...$9來獲取相應分組內(nèi)容,比如希望把字符串1<%2%>34<%567%>89的<%x%>換為$#x#$,我們可以這樣'1<%2%>34<%567%>89'.replace(/<%(\d+)%>/g,'@#$1#@');//"1@#2#@34@#567#@89"當然還有很多方式可以達到這一目的,這里只是演示一下利用分組內(nèi)容,我們在第二個參數(shù)中使用@#$1#@,其中$1表示被捕獲的分組內(nèi)容,在一些js模板函數(shù)中可以經(jīng)常見到這種方式替換字符串。strObj.replace(regObj,function(){})可以通過修改replace方法的第二個參數(shù),使replace更加強大,在前面的介紹中,只能把所有匹配替換為固定內(nèi)容,但如果我希望把一個字符串中所有數(shù)字,都用小括號包起來該怎么弄'2398rufdjg9w45hgiuerhg83ghvif'.replace(/\d+/g,function(r){return'('+r+')';});//"(2398)rufdjg(9)w(45)hgiuerhg(83)ghvif"把replace方法的第二個參數(shù)傳入一個function,這個function會在每次匹配替換的時候調(diào)用,算是個每次替換的回調(diào)函數(shù),我們使用了回調(diào)函數(shù)的第一個參數(shù),也就是匹配內(nèi)容,其實回調(diào)函數(shù)一共有四個參數(shù)第一個參數(shù)很簡單,是匹配字符串第二個參數(shù)是正則表達式分組內(nèi)容,沒有分組則沒有該參數(shù)第三個參數(shù)是匹配項在字符串中的index第四個參數(shù)則是原字符串'2398rufdjg9w45hgiuerhg83ghvif'.replace(/\d+/g,function(a,b,c){console.log(a+'\t'+b+'\t'+c);return'('+a+')';});239802398rufdjg9w45hgiuerhg83ghvif9102398rufdjg9w45hgiuerhg83ghvif45122398rufdjg
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 出國留學銷售代表銷售總結報告
- 二零二五版牙科診所綠色環(huán)保材料使用協(xié)議3篇
- 二零二五年度公租房買賣合同模板及注意事項3篇
- 二零二五年度新能源項目居間合作協(xié)議4篇
- 二零二五年度個人商鋪買賣合同示范4篇
- 2025版贖樓擔保與房地產(chǎn)抵押貸款合同6篇
- 2025版物業(yè)管理公司人力資源外包合作協(xié)議書范本3篇
- 二零二五年度移動支付解決方案個人定制開發(fā)合同4篇
- 二零二五年度高空作業(yè)施工圍板租賃與安裝服務合同2篇
- 二零二五年度紀錄片攝影師制作合同2篇
- 供貨方案及時間計劃安排
- 唐山動物園景觀規(guī)劃設計方案
- 中國版梅尼埃病診斷指南解讀
- 創(chuàng)業(yè)投資管理知到章節(jié)答案智慧樹2023年武漢科技大學
- 暨南大學《經(jīng)濟學》考博歷年真題詳解(宏觀經(jīng)濟學部分)
- 藥店員工教育培訓資料
- eNSP簡介及操作課件
- 運動技能學習與控制課件第七章運動技能的協(xié)調(diào)控制
- 節(jié)后復工吊籃驗收表格
- 《駱駝祥子》第(9、10、11、12)章檢測題
- 《城南舊事》惠安館--解讀
評論
0/150
提交評論