js正則表達(dá)式(第一周)

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中使用它來查找郵箱:


郵箱正則表達(dá).gif

js中正則:

在js中正則用對象表達(dá):

RegExp對象???寫法有兩種:

js風(fēng)格
let regExp = new RegExp("a","i")
perl風(fēng)格
let regExp = /a/i
一般使用Perl風(fēng)格

  1. 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>"

  1. 常用轉(zhuǎn)義字符
常用轉(zhuǎn)義字符 >
\d 數(shù)字 等價于:[0-9]
\w 英文、數(shù)字、下劃線 等價于:[a-z0-9_]
\s 空白字符
\D 非數(shù)字 等價于:[^0-9]
\W 非英文、數(shù)字、下劃線 等價于:[^a-z0-9_]
\S 非空白字符
. 任意字符(一般不用)
^ 行首
& 行位
  1. 量詞
正則中的量詞 >
{n} 正好出現(xiàn)n次
{n,m} 最少n次,最多m次
{n,} 最少n次,不限最多次
+ 最少1次,不限制最多次 等價于:{1,}
? 最少一次0次最多1次,可有可沒有; 等價于:{0,1}
* 可有沒有,也可以有無窮多位; 等價于:{0,}(一般不用)
  1. 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é)果見下圖
url解析.png
  • 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
})()
exec()方法.png

手機(jī)號郵箱正則表達(dá)式分析

  1. 手機(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}


電話號碼匹配.gif

在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;

  1. 郵箱正則表達(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容