實戰JS正則表達式


-正則表達式是一種文本模式的匹配工具。

-文章導讀:

    --1.正則對象的屬性和方法

    --2.字符串對象的方法

    --3.使用正則表達式:

      ---3.1 給字符串加上千分符

      ---3.2 字符串中出現次數最多的字母

      ---3.3 在多行中使用正則表達式

      ---3.4 從url中提取子域名

      ---3.5 分割Unicode字符

      ---3.6 在location對象中使用正則

 

 -----------------------------------------------------------------------------------------------------------------------------------------------------------------------

[新建正則表達式]:

1 var  regexp = /aabb/g; //g可省
2 var  regexp = new Regexp("xyz","g"); //第二個參數可省

區別在於:

1.采用字面量的寫法新建的正則表達式對象在代碼編譯時就會生成,是平常開發中常用的方式;

2.采用構造函數生成的正則對象要在代碼運行時生成。

 [使用正則表達式]:

 正則對象的方法是指這樣使用的: RegExp對象.方法(字符串)

 字符串對象的方法是這樣使用:字符串.方法(RegExp對象)

一、 正則對象的屬性和方法

1.1 正則對象的屬性:

1 ignoreCase //返回一個布爾值表示正則對象是否設置了i修飾符,是一個只讀屬性
2 global //表示正則對象是否設置了g修飾符,返回布爾值
3 multiline //表示是否設置了m修飾符,返回一個布爾值
4 lastIndex //返回下一次開始搜索的位置,該屬性可讀寫,但只在設置了g修飾符時有意義
5 source //返回正則表達式的字符串形式(不包括反斜杠),只讀屬性

這樣用:

1  i  --執行忽略大小寫的匹配
2  g  --執行全局匹配(可以查看所有的匹配而不是只找到第一個匹配后就停止)
3  m  --執行多行匹配

 

1.2 test方法

test方法返回布爾值,用來驗證字符串是否符合某個模式。如果正則表達式帶有g修飾符,則每一次test方法都從上一次匹配結束的位置開始匹配。

使用了g修飾符的正則對象,表示要記錄搜索的位置,接着使用test方法,每次開始搜索的委會都是上一次匹配的后一個位置:

如果正則表達式是一個空字符串,則會匹配所有的字符串,但前提是使用new RegExp()的方式:

 

1.3 exec方法

 exec()返回匹配的結果,匹配成功exec方法返回裝有匹配結果的數組,匹配失敗返回null:

如果正則表達式包含圓括號,則返回的數組會包括多個元素。首先是整個匹配成功的結果,后面是圓括號里匹配成功的結果,如果有多個圓括號,他們的匹配成功的結果都會成為數組元素:

對於調用exec方法后返回的數組具有以下兩個屬性:

1 input --整個原待匹配的字符串
2 index --整個模式匹配成功的開始位置

 同樣,給正則表達式加上g修飾符就可以多次使用exec方法,下一次搜索的位置從上一次成功匹配結束的位置開始。

如果正則對象是一個空字符串:

 

二、字符串對象的方法

 

1 match-----返回匹配的子字符串
2 search----搜索
3 replace---替換
4 split-----分割

2.1 match()方法

字符串對象的match方法與正則對象的exec方法比較類似:

但是如果正則表達式帶有g修飾符,那么match方法與exec方法就有差別了:

可以看到match返回了所有成功匹配的結果,但是exec方法只返回了一個。

 

2.2 search方法

search方法返回匹配成功的位置在整個字符串中的索引,如果沒有匹配成功任何字符則返回-1,search方法會自己忽略g修飾符。

 

2.3 replace方法

str.replace('搜索模式','替換的內容');

可以看到,如果正則表達式不帶g修飾符,那么replace方法會替換第一個匹配成功的結果,如果加上了g修飾符,那么會替換所有匹配成功的值。

replace方法的第二個參數可以使用$符號,用來指代所要替換的內容:

1 $&-----指代匹配的字符串
2 $`-----匹配結果前面的文本
3 $'-----匹配結果后面的文本
4 $n-----指代匹配成功的第n組內容,n從1開始
5 $$-----指代美元符號$

replace方法的第二個參數也可以是函數,用於將第一個參數匹配到的值替換為函數返回值。

同時,作為replace方法的第二個參數的函數也可以由多個參數。它的第一個參數是整個匹配的內容,第二個參數是組匹配(這時有多少個組匹配就有多少個參數),此外最后還可以添加兩個參數,倒數第二個參數是撲捉到的內容在整個字符串中的位置,最后一個參數是原字符串。

 

2.4 split() 方法

split(‘字符串的分割正則’,‘返回數組的最大成員數’);返回分割后各部分組成的數組。

可以變換正則的匹配規則來分割字符串。

上面正則的匹配規則是以0或多個a來進行分割,如果加上括號則括號匹配的部分也就是分割規則也會作為數組成員返回。

 

三、使用正則表達式

正則表達式不僅靈活還很強大,用它能很簡潔的實現很多實用的功能,下面簡單列舉一些:

3.1給字符串加千分符

1          function spli(str){
2              var re = /(?=(?!\b)(\d{3})+$)/g;
3              return str.replace(re,',');
4          }
5          console.log(spli(str));

其中的(?=exp)用來匹配exp前面的位置,(?!exp)匹配后面跟的不是exp的位置,他們都是零寬斷言。

如果要是不用正則表達式的話,代碼會多些:

 1          var str = '12345432';//->[]
 2          function spli(str){
 3             var iNum = str.length%3;//->0,1,2
 4             var prev = '';
 5             var arr = [];
 6             var iNow = 0;
 7             var tmp = '';
 8             //千分號是從后向前三位三位加的,所以把三位余出來的從前面提取到
 9             if(iNum !=0){
10                 prev = str.substring(0,iNum);
11                 arr.push(prev);
12             }
13             //取到多余部分后面的
14             str = str.substring(iNum);
15             for(var i=0;i<str.length;i++){
16                 iNow++;
17                 tmp += str[i];
18                 if(iNow==3 && tmp){
19                     //數組里面放的是三位的數
20                     arr.push(tmp);
21                     tmp = '';
22                     iNow = 0;
23                 }
24             }
25             return arr.join(',');
26          }
27          console.log(spli(str));
View Code

 

3.2字符串中出現次數最多的字符

 1         var str = 'kkkkkkkaaakkkkkkaaaaasddd';
 2         function most(str){
 3              //排序,正則匹配子項
 4              var arr = str.split('');
 5              arr.sort();
 6              str = arr.join('');
 7             // \1匹配前面相同的,也就是說跟(\w)相同的
 8              var re = /(\w)\1+/g;
 9              var num = 0;
10              var value = '';
11              //這里的$0就是找到的重復的整體
12              str.replace(re,function($0,$1){
13                  //alert($0);
14                  if(num<$0.length){
15                   num = $0.length;
16                   value = $1;
17                  }
18              });
19              return '出現次數最多的字符是'+value+'出現了'+num+'次';
20         }
21         console.log(most(str));

其中\1代表分組1匹配的文本。

3.3 在多行中使用正則表達式

 

^符號用來匹配輸入/字符串的開始。如果多行(multiline)標志被設為 true,該字符也會匹配一個斷行(line break)符后的開始處。

3.4 從url中提取子域名

上面的正則匹配/開始的字符串匹配到第一個.就停止了,http://長度為7,所以用了substr(7)之后就會返回子域名了。

3.5 分割Unicode字符

通常用來匹配字符的\w和\W只會匹配基本的ACSCII字符,要匹配Unicode字符的話就要另做處理了:

3.6 在location對象中使用正則

這里有個我越看越暈的例子,額:

來自小胡子==。[玩轉正則之highlight高亮

四、其他

正則表達式的收集:

[常用的正則表達式收集

[ js常用正則表達式]

參考資料:

[RegExp MDN]

[玩轉正則之highlight高亮

 

這里我只是總結了正則表達式相關的方法和屬性,強烈建議閱讀:正則表達式30分鍾入門教程    它教會你如何寫正則表達式,再結合文章上面提到的方法,寫着寫着,正則就不是那么遙不可及了,非常實用喔。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM