js正則表達(dá)式(第一周)
從本周開始我將按時發(fā)表我的日志,每周一篇原創(chuàng),日志內(nèi)容主要是計算機(jī)知識,偶爾也會有電學(xué)內(nèi)容;下面是第一篇內(nèi)容,之所以第一周選正則表達(dá),是因?yàn)槲疑现芟到y(tǒng)的學(xué)習(xí)了一下
什么是正則
一般是用特殊的符號來定義的字符串規(guī)則,表達(dá)了某種字符串規(guī)則,比如可以用來校驗(yàn)電話號碼,郵箱,身份證號等……
寫好的正則表達(dá)式一般很難看的懂
文本編輯軟件中使用正則表達(dá)來查找、替換能大大的提高效率
文本編輯軟件中使用
文本編輯器的使用可以參考下面js中的的規(guī)則
如在 vs code中使用它來查找郵箱:

js中正則:
在js中正則用對象表達(dá):
RegExp對象???寫法有兩種:
js風(fēng)格
let regExp = new RegExp("a","i")
perl風(fēng)格
let regExp = /a/i
一般使用Perl風(fēng)格
- js中常用的正則:
| 元字符/表達(dá)式 | 描述 |
|---|---|
| /a/i | a表示匹配a字符i表示忽略大小寫; |
| /\d/g | \d匹配所有數(shù)字0-9;g找到全部如果不加g找到一個就返回; |
| /\d+/g | +表示多少位都可以; |
| /a|c|/ | 匹配a或者c; |
| /[abc]de/g | 匹配ade或bde或cde |
| /[a-z]/ | 匹配所以字母 |
| /[0-9]/ | 匹配所以數(shù)字 |
| /[^abc]/ | 匹配非a、b、c 的字符; |
| /./ | 匹配任意字符 一般不用 |
正則貪婪 匹配最長字符:比如
//匹配標(biāo)簽
let re=/<.+>/g;
let string="<html><body>哈哈哈</body></html>"
//re匹配string將匹配所有字符,因?yàn)檫@段字符中首位分別為<和>;
//正確寫法
let re=/<[^<>].+>/g;//刨除標(biāo)簽中的“<”和“>”
let string="<html><body>哈哈哈</body></html>"
- 常用轉(zhuǎn)義字符
| 常用轉(zhuǎn)義字符 | > |
|---|---|
| \d | 數(shù)字 等價于:[0-9] |
| \w | 英文、數(shù)字、下劃線 等價于:[a-z0-9_] |
| \s | 空白字符 |
| \D | 非數(shù)字 等價于:[^0-9] |
| \W | 非英文、數(shù)字、下劃線 等價于:[^a-z0-9_] |
| \S | 非空白字符 |
| . | 任意字符(一般不用) |
| ^ | 行首 |
| & | 行位 |
- 量詞
| 正則中的量詞 | > |
|---|---|
| {n} | 正好出現(xiàn)n次 |
| {n,m} | 最少n次,最多m次 |
| {n,} | 最少n次,不限最多次 |
| + | 最少1次,不限制最多次 等價于:{1,} |
| ? | 最少一次0次最多1次,可有可沒有; 等價于:{0,1} |
| * | 可有沒有,也可以有無窮多位; 等價于:{0,}(一般不用) |
- js中常用的正則方法
- Srting.prototype.search()方法
用來找出原字符串中首次出現(xiàn)匹配正則的位置(index),沒有則返回-1
"hello 發(fā)揮不廣泛".search(/發(fā)揮不廣泛/); // 6
- Srting.prototype.test()方法
用來測試字符串中是否含有子字符串
/hello/.test("hello 發(fā)揮不廣泛"); // true
- Srting.prototype.split()方法
用來分割字符串
"發(fā)揮不廣泛Hi張三Hi李四".split(/Hi/); // ["發(fā)揮不廣泛","張三","李四"]
- Srting.prototype.replace()方法
用來替換字符串中的子串
"hello 發(fā)揮不廣泛".replace(/hello/,"hi"); // "hi 發(fā)揮不廣泛"
也可以將匹配到的字符串分組,并根據(jù)分組有選擇的替換內(nèi)容,分組用“()”來確定,用$1表示第一個分組$2表示第二個分組,以此類推,(注意:不是從$0開始)
比如將今天日期字符串“2018年07月26日”換成“26-07-2018”
"2018年07月25日".replace(/(2018)年(07)月(26)日/,"\$3-\$2-\$1") // 26-07-2018
"2018年07月25日".replace(/(\d{4})年(\d{2})月(\d{2})日/,"\$3-\$2-\$1") // 26-07-2018
- Srting.prototype.match()方法
用來捕獲字符串中的子字符串到一個數(shù)組中。默認(rèn)情況下只捕獲一個結(jié)果到數(shù)組中,定義正則表達(dá)式的時候添加參數(shù)g時,會捕獲所有結(jié)果到數(shù)組中
"發(fā)揮不廣泛Hi張三Hi李四".match(/Hi/); // ["Hi"]
"發(fā)揮不廣泛Hi張三Hi李四".match(/Hi/g); // ["Hi","Hi"]
當(dāng)正則表達(dá)式?jīng)]有全局屬性(沒有g(shù)參數(shù))時,且有分組時match()方法只會返回整個匹配的第一個結(jié)果,同時還會把分組匹配到的字符串放到數(shù)組中:
"發(fā)揮不廣泛Hi張三Hi李四".match(/Hi(張三)Hi(李四)/) // ["Hi張三Hi李四","張三","李四"]
用它來解析URL很好用
let url = "https://www.machuang.wang:8080/js/jq.js?id=01";
let re = /^((\w+):\/\/([\w\.]+)):([\w\.]+)\/([^?]+)\?(\S+)$/
let urlArr = url.match(re);
console.log(urlArr); // 結(jié)果見下圖

- Srting.prototype.exec()方法
1.exec函數(shù)在正則表達(dá)式中有分組的情況下,表現(xiàn)和match函數(shù)很像,只是無論正則表達(dá)式是否有全局屬性,exec函數(shù)都只返回一個結(jié)果,并捕獲分組的結(jié)果
/Hi/g.exec("發(fā)揮不廣泛Hi張三Hi李四") // [Hi]
/(H)i/g.exec("發(fā)揮不廣泛Hi張三Hi李四") // [Hi,H]
2.正則表達(dá)式對象(即js中的RegExp對象)有一個lastIndex屬性,用來表示下一次從哪開始捕獲,每執(zhí)行一次exec()方法后,lastIndex就會向后推,直到找不到匹配的字符時返回null,然后再從頭開始繼續(xù)捕獲。用這個可以遍歷捕獲的字符串中的子串。
let re = /Hi/g;
let string = "發(fā)揮不廣泛Hi張三Hi李四"
(function(){
console.log(re.lastIndex); // 0
console.log(re.exec(string)); // [Hi]
console.log(re.lastIndex); // 7
console.log(re.exec(string)); // [Hi]
console.log(re.lastIndex); // 11
console.log(re.exec(string)); // null
console.log(re.lastIndex); // 0
})()

手機(jī)號郵箱正則表達(dá)式分析
- 手機(jī)號正則表達(dá)式分析
手機(jī)號為11位數(shù)字(不討論 +86)
我目前了解的手機(jī)號第一位只能是1,第二位只能是3、5、7、8;
| 11手機(jī)號 | 第1位 | 第2位 | 第3~11位 |
|---|---|---|---|
| 可能數(shù)字 | 1 | 3、5、7、8 | 0~9 |
| 正則表達(dá)式 | 1 | [3578] | \d{9} |
根據(jù)以上表格匹配手機(jī)號正則為:
1[3578]\d{9}

在js中匹配手機(jī)號通常是用于校驗(yàn)手機(jī)號,最常見的就是校驗(yàn)用戶輸入的手機(jī)號格式是否正確,如果按上面的格式書寫則:
let shoujihao1 = "jlagjlafgl13645130956235jljglj";
let shoujihao2 = "13645130956";
let re = /1[3578]\d{9}/;
console.log(re.test(shoujihao1)) //true;
console.log(re.test(shoujihao2)) //true;
re.test(shoujihao1)也是true顯然shoujihao不是一個正確的手機(jī)號所以加上行頭行位校驗(yàn),正則為:^1[3578]\d{9}$
let shoujihao1 = "jlagjlafgl13645130956235jljglj";
let shoujihao2 = "13645130956";
let re = /^1[3578]\d{9}$/;
console.log(re.test(shoujihao1)) //false;
console.log(re.test(shoujihao2)) //true;
- 郵箱正則表達(dá)式分析
郵箱的一般格式為:XXXXXXXX@XXXXX.XXXX.XXXX
我簡單的以郵箱@前為任意數(shù)字、字母、_、和-組成
| 郵箱 | 第一部分 | 第二部分 | 第三部分 | 第四部分 | 第五部分 | 第六部分 | 第七部分 |
|---|---|---|---|---|---|---|---|
| 規(guī)則 | 任意數(shù)字、任意字母、_、- | @ | 任意數(shù)字、任意字母、_、- | . | 無或者任意數(shù)字、任意字母、_、- | . | 2~6位的數(shù)字或字母 |
| 正則表達(dá)式 | [0-9a-zA-Z-_]+ | @ | [0-9a-zA-Z-_]+ | . | [0-9a-zA-Z-_]* | . | [a-zA-Z0-9]{2,6} |
匹配郵箱正則為:[0-9a-zA-Z_-]+@[a-zA-Z0-9-]+(.[a-zA-Z0-9-]+)*.[a-zA-Z0-9]{2,6}
同理在js在用于郵箱校驗(yàn)也要加上行頭行尾校驗(yàn)……
20180726