假如不經(jīng)常寫正則表達(dá)式的話,真是學(xué)一遍忘一遍灭忠。自己再?gòu)?fù)習(xí)一遍正則表達(dá)式膳算。另外,歸納篇會(huì)持續(xù)更新文章更舞,但更新的目錄可能是跳躍式畦幢,因?yàn)橹饕俏易约翰槿毖a(bǔ)漏,參考梳理缆蝉,后面還會(huì)再開(kāi)一篇常用正則表達(dá)式匯總宇葱,自己寫一遍加深這些規(guī)則,以后項(xiàng)目中要是用到可以比較方便刊头。
正則表達(dá)式的定義
- 正則表達(dá)式是一個(gè)描述字符模式的對(duì)象黍瞧。
- ECMAScript中的RegExp類表示正則表達(dá)式。
- 正則表達(dá)式用來(lái)驗(yàn)證客戶端的輸入數(shù)據(jù)原杂。
創(chuàng)建正則表達(dá)式
- 和創(chuàng)建字符串類似印颤,一種是new方式,一種是字面量方式
var pattern =new RegExp('pattern',‘gi’); //new方式穿肄,第一個(gè)參數(shù)是模式字符串年局,第二個(gè)可選參數(shù)是模式修飾符
var pattern2=/pattern2/ig; //字面量方式,模式修飾符i(忽略大小寫),g(全局匹配),m(多行匹配)
正則表達(dá)式的屬性和方法
- 靜態(tài)屬性和實(shí)例屬性(都沒(méi)啥大用咸产,了解過(guò)下)
- 靜態(tài)屬性 :input矢否、leftContext、rightContect脑溢、lastMatch僵朗、lastPattern、multiline
var pattern =/google/;
var str='This is a google!';
pattern.test(str);//必須執(zhí)行一下屑彻,靜態(tài)屬性才有效
alert(RegExp.input) //當(dāng)前被匹配的字符串
alert(RegExp.leftContext) //當(dāng)前被匹配的字符串的前子串
alert(RegExp.rightContext) //當(dāng)前被匹配的字符串的后子串
alert(RegExp.lastMatch) //google 最后一個(gè)被匹配的字符串
alert(RegExp.lastPattern)// 最后一對(duì)圓括號(hào)里匹配的字符串
alert(RegExp.multiline)// false 用于指定是否所有的表達(dá)式都用于多行的布爾值
- 實(shí)例屬性:global验庙、ignoreCase、lastIndex社牲、multiline粪薛、source
- 2個(gè)測(cè)試方法test()和exec();1個(gè)編譯方法compile()
-
test()
在字符串中測(cè)試模式匹配,返回true和false; -
exec()
在字符串中執(zhí)行匹配搜索搏恤,返回結(jié)果數(shù)組违寿,其中存放匹配的結(jié)果让禀;如果沒(méi)有匹配就返回null;
-
-
compile()
編譯和改變后重新編譯正則表達(dá)式;
- 使用字符串的正則表達(dá)式的4個(gè)方法:
-
match()
:返回pattern中 子串或null陨界;獲取匹配的數(shù)組 -
replace(pattern,replacement)
:返回替換后的字符串; -
search()
:返回匹配字符串中開(kāi)始位置痛阻,找不到則返回-1 -
split()
:返回字符串指定匹配字符串拆分的數(shù)組
var pattern =/google/g;
var str='this google googlea googlea';
console.log(str.match(pattern)); //返回?cái)?shù)組["google", "google", "google"]
console.log(str.replace(pattern,'box')); //開(kāi)啟全局菌瘪,全部替換,返回this box boxa boxa
console.log(str.search(pattern)); //返回位置5
console.log(str.split(pattern)); //返回?cái)?shù)組["this ", " ", "a ", "a"]
正則表達(dá)式的符號(hào)
- 正則表達(dá)式由兩種基本字符類型組成:原義文本字符和元字符
- 元字符是在正則表達(dá)式中含有特殊含義的非字母字符
\t //水平制表符
\v //垂直制表符
\n //換行符
\r //回車符
\0 //空字符
\f //換頁(yè)符
\cX //與X對(duì)應(yīng)的控制字符(Ctrl+x)
- 字符類:
var pattern=/[abc]/ //泛指字符abc這一類的字符
var pattern=/[^abc]/ //^創(chuàng)建反向類/負(fù)向類阱当,不屬于某類的內(nèi)容俏扩。表示不是a或b或c的內(nèi)
- 范圍類
'assklja1223'.replace(/[a-z]/g,'7'); // 得到"77777771223"。[a-z]表示26個(gè)小寫字母a-z弊添,也可以連寫[a-zA-Z]
'as-sk-lja-122-3'.replace(/[a-z-]/g,'Q'); //得到"QQQQQQQQQQ122Q3"录淡。要匹配連字符-就直接加在里面[a-z-]
- js預(yù)定義類及邊界
. //除了回車符和換行符之外的所有字符
\d //數(shù)字字符
\D //非數(shù)字字符
\s //空白符
\S //非空白符
\w //單詞字符(字母數(shù)字下劃線)
\W //非單詞字符
^ //以什么開(kāi)始,只有在[]里面^表示取反
$ //以什么結(jié)束
\b //單詞邊界
\B //非單詞邊界
-
量詞
- 匹配連續(xù)出現(xiàn)多次
?//出現(xiàn)0次或1次
+ //至少出現(xiàn)1次
* //出現(xiàn)任意次
{n} //出現(xiàn)n次
{n,m} //出現(xiàn)n到m
{n,} //至少出現(xiàn)n次
- 匹配連續(xù)出現(xiàn)多次
-
js正則貪婪模式和非貪婪模式
- 正則表達(dá)式默認(rèn)會(huì)盡可能多的去匹配
'12345678'.replace(/\d{3,6}/g,'S') //得出'S78'
- 讓正則表達(dá)式盡可能少的匹配油坝,一旦匹配成功不再繼續(xù)嘗試匹配就是非貪婪模式嫉戚。做法就是在量詞后面加上?
'123456789'.match(/\d{3,5}?/g) //得出["123", "456", "789"]
- 正則表達(dá)式默認(rèn)會(huì)盡可能多的去匹配
-
分組
- 使用()可以達(dá)到使量詞作用于分組
'a1b2c3d4'.replace(/([a-z]\d){2}/g,'Ac') //得到"AcAc"
- 或 (使用 | 可以達(dá)到或的效果)
'carrfcaggty'.replace(/ca(rr|gg)/g,'BB') //得到'BBfBBty'
- 反向引用
//2015-12-25=>12/25/2015
//只有在分組里澈圈,$1$2$3捕獲分組
'2015-12-25'.replace(/(\d{4})-(\d{2})-(\d{2})/g,'$2/$3/$1');
//如果不希望某些分組被捕獲彬檀,只要在分組內(nèi)加上?:就可以
- 使用()可以達(dá)到使量詞作用于分組
-
前瞻
- 正則表達(dá)式從文本頭部像文本尾部開(kāi)始解析瞬女,文本尾部方向窍帝,稱為“前”。
- 前瞻就是在正則表達(dá)式匹配到規(guī)則的時(shí)候诽偷,向前檢查是否符合斷言坤学;后顧/后瞻方向相反
- JavaScript不支持后顧
- 符合和不符合特定斷言稱為肯定/正向匹配和否定/負(fù)向匹配
'a2*3'.replace(/\w(?=\d)/g,'x') //得出"x2*3"。 //正向前瞻exp(?=assert) //負(fù)向前瞻exp(?!=assert) //前面是一個(gè)正則报慕,后面是一個(gè)斷言規(guī)則