摘要:通過學習課程正則表達式對視頻教學內容做一個知識整理。理解這個請看下面方法正則表達式的源文本。簡單的就是找到匹配字符的開始位置找到一個或多個正則表達式的匹配。與有些許相似,只是返回的內容更加細節替換與正則表達式匹配的子串。
通過學習imooc課程《JavaScript正則表達式》對視頻教學內容做一個知識整理。視頻源地址:http://www.imooc.com/video/12539
一個正則表達式在線工具:http://regexper.com
JavaScript 通過內置對象RegExp支持正則表達式,有兩種方法實例化RegExp對象:
字面量 eg: var reg = /bisb/g;
構造函數 eg: var reg = new RegExp("/bisb/","g" );
1.修飾符g:global全文搜索,不添加,搜索到第一個匹配停止;
i:ignore case忽略大小寫;
m:multiple lines多行搜索;
2.元字符正則表達式有兩種基本字符類型組成:
原義文本字符,即要找什么就是什么,要找a就直接寫a,找123就直接寫123;
元字符,有特殊含義的非字母字符:* ? + $ ^ . | ( ) { } [ ];
其他的還有:
一般情況正則表達式一個字符對應字符串一個字符,eg 表達式abt含義是 "ab" tab制表符;一般由元字符 [ ] 來構建一個簡單的類,不是特指某個字符,eg [abc]把字符a或b或c歸為一類;在[ ]里面加 ^ 表示取反,eg 1代表不要有a或b或c;
4.范圍類用[a-zA-Z0-9]來代表a到z或A到Z貨0到9中任意字符;
5.預定義類 6.量詞再有很常用的 ^n 匹配任何開頭為 n 的字符串 ; n$匹配任何結尾為 n 的字符串。
還有一個易混淆的,?=n 匹配任何其后緊接指定字符串 n 的字符串。就是說要找到的這個字符后面一定要跟字符n
var reg = "a1b1c1ddeeff"; reg.replace(/w(?=d)/g,"Y");
結果是"Y1Y1Y1ddeeff" ;
與之相反的就是 !?=n;
正則表達式在默認下是盡可能多的匹配,eg "123456789".replace(/d{2,5}/g,"X"); 結果是X6789,默認貪婪模式,以{2,5}范圍中最大的為標準匹配。
要設置成非貪婪模式可以"123456789".replace(/d{2,5}?/g,"X");結果為XXXX9,即按{2,5}中最小的2來匹配,12,34,56,78都匹配成功變成X,剩下9沒有匹配成功
8.分組使用()可以達到分組功能,使量詞作用于分組,eg "a1b1c1d2".replace(/[a-z]d{3}/g,"x");這里{3}是直接作用與最接近的d,即找[a-z]然后連續出現3個數字,"a1b1c1d2".replace(/([a-z]d){3}/g,"x");這樣就能找到連續出現三次(一個字母加一個數字),就是"a1b1c1"這個字符串了;
9.對象屬性global(只可讀,不可寫)
ignoreCase(只可讀,不可寫)
multiline(只可讀,不可寫)
lastIndex 一個整數,標示開始下一次匹配的字符位置。(理解這個請看下面方法test())
source 正則表達式的源文本。
10.方法test() 檢索字符串中指定的值。返回 true 或 false。
exec() 檢索字符串中指定的值。返回找到的值,并確定其位置。
compile() 編譯正則表達式。
test(): eg var reg = /w/g; reg.test("ab");結果是true,但多執行幾次會發現
最后一個結果變成false,這其實和RegExp屬性lastIndex有關,
var reg = /w/g; while(reg.test("ab")){ console.log(reg.lastIndex); }
結果是1,2,這是因為第一次test會匹配到a,這時lastIndex就是這個字符a的下一位,即b的位置1,接著test還會繼續向后面匹配,輪到這個b,這是lastIndex就是b后面的位置2,之后會重置為0,從頭開始循環。要避免這種test出現不穩定輸出,可以直接/w/g.test("ab");
exec() :返回一個數組,其中存放匹配的結果。如果未找到匹配,則返回值為 null。借用w3school上的話,如果 exec() 找到了匹配的文本,則返回一個結果數組。否則,返回 null。此數組的第 0 個元素是與正則表達式相匹配的文本,第 1 個元素是與 RegExpObject 的第 1 個子表達式相匹配的文本(如果有的話),第 2 個元素是與 RegExpObject 的第 2 個子表達式相匹配的文本(如果有的話),以此類推。
看代碼:
var reg = /d(w)(w)d/; var str = "1ax2by3cz4d5e"; var ret = reg.exec(str); console.log(ret);
輸出:["1ax2", "a", "x"]
這里返回的數組第一個就是匹配到的1a2,然后第二和第三個數組就是1a2中間的a和x,因為/d(w)d/里面的子表達式就是(w)(w);
同樣的來看正則對象的lastIndex屬性,以及匹配結果的數組的index屬性:
var reg = /d(w)(w)d/g; var str = "$1ax2by3cz4dd5ee"; while(ret = reg.exec(str)){ console.log(reg.lastIndex + " " + ret.index + " " + ret); }
輸出:
"5 1 1ax2,a,x"
"11 7 3cz4,c,z"
第一個:5,指第一次匹配后reg對象的lastIndex(紅色后面的位置),1指的是exec()方法返回的位置,$后面開始匹配到的,所以是1;
第二個:11,指第一次匹配后reg對象的lastIndex(藍色后面的位置),7指exec()方法返回的位置,y后面開始匹配到的,所以是7;
compile():我的理解是可以修改正則表達式,看代碼
function CompileDemo(){ var rs; var s = "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPp" var r = new RegExp("[A-Z]", "g"); var a1 = s.match(r); r.compile("[a-z]", "g"); var a2 = s.match(r); return(a1 + " " + a2); } console.log(CompileDemo());
輸出:
"A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P
a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p"
search() 檢索與正則表達式相匹配的值。(簡單的就是找到匹配字符的開始位置)
match() 找到一個或多個正則表達式的匹配。(與exec()有些許相似,只是exec()返回的內容更加細節)
replace() 替換與正則表達式匹配的子串。(這個不多說)
split() 把字符串分割為字符串數組。(這個也容易,就是注意別忘了)
(這里要注意10 和 11 是完全對應不同對象的方法,一個是RegExp對象的方法,一個是String對象的方法)
這部分主要在JavaScript string對象部分有學習到,可以參考http://www.w3school.com.cn/js...
abc ?
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/87395.html
摘要:介紹這周開始學習老姚大佬的正則表達式迷你書,然后習慣性的看完一遍后,整理一下知識點,便于以后自己重新復習。感謝原書作者老姚,本文無意抄襲,只是作為自己知識點的整理,后續也會整理到自己的知識庫網站中。等價于,表示出現次。 showImg(https://segmentfault.com/img/remote/1460000018530584?w=919&h=449); 介紹 這周開始學習...
摘要:個人前端文章整理從最開始萌生寫文章的想法,到著手開始寫,再到現在已經一年的時間了,由于工作比較忙,更新緩慢,后面還是會繼更新,現將已經寫好的文章整理一個目錄,方便更多的小伙伴去學習。 showImg(https://segmentfault.com/img/remote/1460000017490740?w=1920&h=1080); 個人前端文章整理 從最開始萌生寫文章的想法,到著手...
閱讀 3834·2021-09-06 15:00
閱讀 2171·2019-08-30 15:53
閱讀 3277·2019-08-23 16:44
閱讀 944·2019-08-23 15:19
閱讀 1391·2019-08-23 12:27
閱讀 4187·2019-08-23 11:30
閱讀 581·2019-08-23 10:33
閱讀 369·2019-08-22 16:05