亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Regex > 正文

JavaScript系列文章:詳解正則表達式基本知識

2020-03-16 20:57:10
字體:
來源:轉載
供稿:網友

正則表達式是一個精巧的利器,經常用來在字符串中查找和替換,JavaScript語言參照Perl,也提供了正則表達式相關模塊,開發當中非常實用,在一些類庫或是框架中,比如jQuery,就存在大量的正則表達式,所以說學好正則表達式,是提高開發技能的一項基本要求。那么今天博主就來詳細總結一下正則表達式的相關知識,希望不熟悉的同學們,也能夠掌握正則表達式的原理及應用。

在JS中,創建正則表達式有兩種方式,一種是字面量方式,一種是構造器方式,如下所示:

var regex = //w+/;// 或者var regex = new RegExp('//w+');

大家也許注意到,使用字面量要比構造器簡潔得多,/w表示一個word,匹配單個字母、數字或下劃線,而使用RegExp構造器時,我們的正則變為了"//w",這是因為要在字符串中表示一個反斜杠/,我們需要對其轉義,也就是在前面再加一個轉義字符/。相信大家都知道,要在字面量正則中表達一個匹配反斜杠/的正則,只需寫成//這樣,但在字符串中表達這個正則,則是"////"這個樣子的,這是因為字符串中前兩個表示一個反斜杠/,后兩個也表示一個反斜杠/,最終在正則層面,結果還是//。

對于上面兩種創建形式,都可以加上一些后綴修飾符,這些修飾符可以單個使用,也可以組合起來使用:

 

復制代碼 代碼如下:

//w+/g; // global search
//w+/i; // ignore case
//w+/m; // multi-line
//w+/u; // unicode
//w+/y; // sticky

//w+/gi;
new RegExp('//w+', 'gi');
 

 

從英文注釋來看,相信大家都大概都略知一二了,需要注意的是u和y修飾符,它們是ES6新增的特性,u表示啟用Unicode模式,對于匹配中文特別有用,而y是sticky,表示“粘連”,跟g很相似,都屬于全局匹配,但它們也有不同之處,這個我們后面會介紹。

正則相關方法

有了正則表達式對象了,如何使用呢?JS中的正則和字符串在原型中均提供相應的方法,先來看看正則原型中的兩個方法:

RegExp.prototype.test(str);RegExp.prototype.exec(str);

上面的test()和exec()方法都需傳入一個字符串,對這個字符串進行搜索和匹配,不同的是,test()方法會返回true或false,表示字符串和正則是否匹配,而exec()方法在匹配時返回一個匹配結果數組,如果不匹配,則只返回一個null值,下面來看看兩者的差異:

// RegExp#test()var regex = /hello/;var result = regex.test('hello world');  // true// RegExp#exec()var regex = /hello/;var result = regex.exec('hello world');  // ['hello']

對于exec()方法,如果正則中含有捕獲組,匹配后則會出現在結果數組中:

// (llo)是一個捕獲組var regex = /he(llo)/;var result = regex.exec('hello world');  // ['hello', 'llo']

開發當中,test()方法一般用于用戶輸入驗證,比如郵箱驗證,手機號驗證等等,而exec()方法一般用于從特定內容中獲取有價值的信息,比如從用戶郵箱輸入中獲取其ID和郵箱類型,從手機號中獲取此號碼的歸屬地等等。

字符串相關方法

上面是正則原型中的兩個方法,現在來看看字符串原型中都提供了哪些可用的方法:

String.prototype.search(regexp);String.prototype.match(regexp);String.prototype.split([separator[, limit]]);String.prototype.replace(regexp|substr, newSubStr|function);

先來說說String#search()方法,它會根據正則參數對字符串進行匹配搜索,如果匹配成功,就返回第一次匹配處的索引,如果匹配失敗,則返回-1。

// String#search()'hello world'.search(/hello/);  // 0'hello world'.search(/hi/);    // -1

String#match()方法跟RegExp#exec()方法相似,會返回結果數組,所不同的是,如果String#match()的正則參數中含有全局標記g,則結果中會只出現匹配的子串,而忽略捕獲組,這一點與RegExp#exec()有些出入。且看下面代碼:

// String#match()'hello hello'.match(/he(llo)/);   // ['hello', 'llo']// String#match()遇到全局g修飾符時會舍棄捕獲組'hello hello'.match(/he(llo)/g);  // ['hello', 'hello']// RegExp#exec()仍舊包含捕獲組/he(llo)/g.exec('hello hello');   // ['hello', 'llo']

所以,如果需要總是將捕獲組作為結果返回,應該使用RegExp#exec()方法,而不是String#match()方法。

接下來說說String#split()方法,這個方法用于將字符串分割,然后返回一個包含其子串的數組結果,其中separator和limit參數都是可選的,separator可指定為字符串或正則,limit指定返回結果個數的最大限制。如果separator省略,該方法的數組結果中僅包含自身源字符串;如果sparator指定一個空字符串,則源字符串將被以字符為單位進行分割;如果separator是非空字符串或正則表達式,則該方法會以此參數為單位對源字符串進行分割處理。下面代碼演示了該方法的使用:

// String#split()'hello'.split();         // ["hello"]'hello'.split('');        // ["h", "e", "l", "l", "o"]'hello'.split('', 3);       // ["h", "e", "l"]// 指定一個非空字符串var source = 'hello world';var result = source.split(' ');  // ["hello", "world"]// 或者使用正則表達式var result = source.split(//s/); // ["hello", "world"]如果separtor是一個正則表達式,并且正則中包含捕獲組,則捕獲組也會出現在結果數組中:// String#split() 正則捕獲組var source = 'matchandsplit';var result = source.split('and');   // ["match", "split"]var result = source.split(/and/);   // ["match", "split"]// 正則中含捕獲組var result = source.split(/(and)/);  // ["match", "and", "split"]

最后來介紹一下String#replace()方法,它會同時執行查找和替換兩個操作。

從上面的函數簽名來看,該方法會接受兩個參數:第一個參數可以是一個正則表達式,也可以是一個字符串,它們都表示將要匹配的子串;第二個參數可以指定一個字符串或是一個函數,如果指定一個字符串,表示這個字符串將會替換掉已匹配到的子串,如果指定一個函數,則函數的返回值會替換掉已匹配的子串。

String#replace()方法最終會返回一個新的已經過替換的字符串。下面分別演示了replace方法的使用:

// String#replace()var source = 'matchandsplitandreplace';var result = source.replace('and', '-'); // "match-splitandreplace"// 或者var result = source.replace(/and/, function() { return '-';});                    // "match-splitandreplace"

從上面的代碼中可以看到,'and'被替換成了'-',但我們同時也注意到,只有第一個'and'被替換了,后面的并沒有被處理。這里我們就需要了解,String#replace()方法只對第一次出現的匹配串進行替換,如果我們需要全局替換,需要將第一個參數指定為正則表達式,并追加全局g修飾符,就像下面這樣:

// String#replace() 全局替換var source = 'matchandsplitandreplace';var result = source.replace(/and/g, '-'); // "match-split-replace"var result = source.replace(/and/g, function() { return '-';});                    // "match-split-replace"

初學者看到上面的代碼,可能會覺得疑惑,對于第二個參數,直接指定一個字符串也挺簡單的嘛,我們為何要使用一個函數然后再返回一個值呢。我們看看下面的例子就知道了:

// String#replace() 替換函數的參數列表var source = 'matchandsplitandreplace';var result = source.replace(/(a(nd))/g, function(match, p1, p2, offset, string) {  console.group('match:'); console.log(match, p1, p2, offset, string); console.groupEnd(); return '-';});                    // "match-split-replace"

上面代碼中,第一個參數是正則表達式,其中包含了兩個捕獲組(and)和(nd),第二個參數指定一個匿名函數,其函數列表中有一些參數:match, p1, p2, offset, string,分別對應匹配到的子串、第一個捕獲組、第二個捕獲組、匹配子串在源字符串中的索引、源字符串,我們可以稱這個匿名函數為“replacer”或“替換函數”,在替換函數的參數列表中,match、offset和string在每一次匹配時總是存在的,而中間的p1、p2等捕獲組,String#replace()方法會根據實際匹配情況去填充,當然,我們還可以根據arguments獲取到這些參數值。

下面是代碼運行后的控制臺打印結果:

js正則表達式基本語法,js正則表達式語法,javascript正則表達式

現在來看,指定一個函數要比指定一個字符串功能強的多,每次匹配都能獲取到這些有用的信息,我們可以對其進行一些操作處理,最后再返回一個值,作為要替換的新子串。所以推薦在調用String#replace()方法時,使用上面這種方式。

上面是String類與正則相關的常用方法,需要注意的是,String#search()和String#match()方法簽名中參數均為正則對象,如果我們傳遞了其他類型的參數,會被隱式轉換為正則對象,具體的步驟是先調用參數值的toString()方法得到字符串類型的值,然后調用new RegExp(val)得到正則對象:

// -> String#search(new RegExp(val.toString()))'123 123'.search(1);    // 0'true false'.search(true); // 0'123 123'.search('//s');  // 3var o = { toString: function() {  return '//s'; }};'123 123'.search(o);    // 3// -> String#match(new RegExp(val.toString()))'123 123'.match(1);     // ["1"]'true false'.match(true);  // ["true"]'123 123'.match('//s');   // [" "]var o = { toString: function() {  return '1(23)'; }};'123 123'.match(o);     // "123", "23"]

而split()和replace()方法不會將字符串轉為正則表達式對象,對于其他類型值,只會調用其toString()方法將參數值轉為字符串,也不會進一步向正則轉換,大家可以親自測試一下。

以上就是正則的相關基本知識及常用方法,限于篇幅原因,更多關于正則表達式的內容,博主會安排在下一篇中介紹和講解,敬請期待。


注:相關教程知識閱讀請移步到正則表達式頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美在线国产精品| 亚洲欧洲国产精品| 日韩在线视频中文字幕| 亚洲欧洲在线观看| 久久在线观看视频| 欧美激情喷水视频| 91美女片黄在线观看游戏| 日韩成人中文字幕在线观看| 色99之美女主播在线视频| 久久久久久久久久亚洲| 91久久精品国产91性色| 国产精品中文字幕久久久| 亚洲国产精品电影在线观看| 中文字幕欧美精品在线| 国内揄拍国内精品少妇国语| 亚洲第一精品夜夜躁人人爽| 色偷偷av亚洲男人的天堂| 538国产精品视频一区二区| 久久精彩免费视频| 欧美黄色片免费观看| 97av在线视频免费播放| 精品国产欧美一区二区三区成人| 国产成人啪精品视频免费网| 国产精品视频自在线| 日韩在线精品一区| 亚洲午夜精品久久久久久久久久久久| 亚洲人a成www在线影院| 欧美日韩精品在线视频| 亚洲97在线观看| 亚洲成色777777女色窝| 92裸体在线视频网站| 欧美人成在线视频| 欧美激情性做爰免费视频| 国产一区二区日韩精品欧美精品| 日韩在线播放一区| 日本欧美国产在线| www.欧美免费| 欧美在线国产精品| 久久天堂av综合合色| 姬川优奈aav一区二区| 亚洲精品影视在线观看| 国产精品视频999| 久久久久国产视频| 性日韩欧美在线视频| 欧美老女人bb| 欧美一级大片视频| 91九色视频在线| 欧美精品18videos性欧美| 九九热99久久久国产盗摄| 色伦专区97中文字幕| 欧美另类暴力丝袜| 国产成人精品久久二区二区| 亚洲人在线观看| 国产一区二区三区中文| 久久九九全国免费精品观看| 欧美影院成年免费版| 久久精品视频99| 国产这里只有精品| 亚洲欧美综合精品久久成人| 欧美视频一区二区三区…| 久久综合免费视频| 国产成人97精品免费看片| 欧美激情xxxx性bbbb| 亚洲性生活视频| 欧美一区二粉嫩精品国产一线天| 国产精自产拍久久久久久| 欧美日韩视频在线| 成人综合国产精品| 国产精品久久999| 欧美在线观看www| 国产日韩综合一区二区性色av| 中国日韩欧美久久久久久久久| 国产亚洲欧美一区| 亚洲精品国精品久久99热| 欧美极品少妇xxxxⅹ裸体艺术| 久久这里有精品| 性欧美办公室18xxxxhd| 欧美xxxx14xxxxx性爽| 伊人久久综合97精品| 国产一区二区三区在线播放免费观看| 亚洲成人精品视频| 精品久久久91| 国产99久久精品一区二区 夜夜躁日日躁| 高清在线视频日韩欧美| 亚洲欧美日韩第一区| 中文字幕成人在线| 欧美午夜精品久久久久久久| 日产精品99久久久久久| 一个人www欧美| 9.1国产丝袜在线观看| 亚洲欧美另类人妖| 日韩精品久久久久久福利| 精品综合久久久久久97| 亚洲国产精品yw在线观看| www.久久久久| 亚洲影院色无极综合| 欧美日韩国产黄| 日本免费久久高清视频| 国产精品最新在线观看| 欧美精品videosex极品1| 精品久久久一区| 97视频色精品| 久久精品91久久久久久再现| 精品国产一区二区三区久久狼5月| 一本色道久久88精品综合| 成人在线激情视频| 国产精品视频一区二区高潮| 日韩一区视频在线| 97香蕉超级碰碰久久免费的优势| 国产91精品黑色丝袜高跟鞋| 久久久免费高清电视剧观看| 97av视频在线| 久久久国产视频91| 亚洲成avwww人| 欧美午夜精品久久久久久人妖| 国产精品视频免费观看www| 91色视频在线导航| 国产精品最新在线观看| 97视频免费观看| 久久九九免费视频| 欧美视频第一页| 欧美久久精品午夜青青大伊人| 成人精品一区二区三区电影免费| 中文字幕在线看视频国产欧美| 黄色成人av网| 欧美亚洲日本黄色| 全亚洲最色的网站在线观看| 92国产精品视频| 欧美中文字幕在线观看| 国产一区二区三区直播精品电影| 国产精品福利网| 久久在精品线影院精品国产| 久久99国产精品久久久久久久久| 成人免费网站在线观看| 亚洲精品日韩丝袜精品| 成人精品视频在线| 久久久亚洲影院你懂的| 国产精品久久久久久亚洲调教| 亚洲va国产va天堂va久久| 欧美激情精品久久久久久大尺度| 国产午夜精品免费一区二区三区| 欧美电影免费观看电视剧大全| 欧美夫妻性生活视频| 亚洲xxxx妇黄裸体| 成人妇女淫片aaaa视频| 亚洲片av在线| 国产精品高潮视频| 66m—66摸成人免费视频| 国产一区二区av| 欧美富婆性猛交| 欧美高清在线视频观看不卡| 国产精品九九久久久久久久| 精品视频久久久久久| 久久久久久久久久亚洲| 欧美亚洲激情在线| 亚洲精品一区中文| 国产精品第三页| 欧美视频一区二区三区…| 欧美视频在线观看免费| 欧美日韩国产中文精品字幕自在自线| 亚洲综合色av| 成人高清视频观看www| 奇米一区二区三区四区久久| 日韩中文字幕在线视频|