正規表示式是一種文字模式的匹配工具。
[新建正規表示式]:
1 2 |
var regexp = /aabb/g; //g可省 var regexp = new Regexp("xyz","g"); //第二個引數可省 |
區別在於:
1.採用字面量的寫法新建的正規表示式物件在程式碼編譯時就會生成,是平常開發中常用的方式;
2.採用建構函式生成的正則物件要在程式碼執行時生成。
[使用正規表示式]:
正則物件的方法是指這樣使用的: RegExp物件.方法(字串)
字串物件的方法是這樣使用:字串.方法(RegExp物件)
一、 正則物件的屬性和方法
1.1 正則物件的屬性:
1 2 3 4 5 |
ignoreCase //返回一個布林值表示正則物件是否設定了i修飾符,是一個只讀屬性 global //表示正則物件是否設定了g修飾符,返回布林值 multiline //表示是否設定了m修飾符,返回一個布林值 lastIndex //返回下一次開始搜尋的位置,該屬性可讀寫,但只在設定了g修飾符時有意義 source //返回正規表示式的字串形式(不包括反斜槓),只讀屬性 |
這樣用:
1 2 3 |
i --執行忽略大小寫的匹配 g --執行全域性匹配(可以檢視所有的匹配而不是隻找到第一個匹配後就停止) m --執行多行匹配 |
1.2 test方法
test方法返回布林值,用來驗證字串是否符合某個模式。如果正規表示式帶有g修飾符,則每一次test方法都從上一次匹配結束的位置開始匹配。
使用了g修飾符的正則物件,表示要記錄搜尋的位置,接著使用test方法,每次開始搜尋的委會都是上一次匹配的後一個位置:
如果正規表示式是一個空字串,則會匹配所有的字串,但前提是使用new RegExp()的方式:
1.3 exec方法
exec()返回匹配的結果,匹配成功exec方法返回裝有匹配結果的陣列,匹配失敗返回null:
如果正規表示式包含圓括號,則返回的陣列會包括多個元素。首先是整個匹配成功的結果,後面是圓括號裡匹配成功的結果,如果有多個圓括號,他們的匹配成功的結果都會成為陣列元素:
對於呼叫exec方法後返回的陣列具有以下兩個屬性:
1 2 |
input --整個原待匹配的字串 index --整個模式匹配成功的開始位置 |
同樣,給正規表示式加上g修飾符就可以多次使用exec方法,下一次搜尋的位置從上一次成功匹配結束的位置開始。
如果正則物件是一個空字串:
二、字串物件的方法
1 2 3 4 |
match-----返回匹配的子字串 search----搜尋 replace---替換 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 |
$ |
replace方法的第二個引數也可以是函式,用於將第一個引數匹配到的值替換為函式返回值。
同時,作為replace方法的第二個引數的函式也可以由多個引數。它的第一個引數是整個匹配的內容,第二個引數是組匹配(這時有多少個組匹配就有多少個引數),此外最後還可以新增兩個引數,倒數第二個引數是撲捉到的內容在整個字串中的位置,最後一個引數是原字串。
2.4 split() 方法
split(‘字串的分割正則’,‘返回陣列的最大成員數’);返回分割後各部分組成的陣列。
可以變換正則的匹配規則來分割字串。
上面正則的匹配規則是以0或多個a來進行分割,如果加上括號則括號匹配的部分也就是分割規則也會作為陣列成員返回。
三、使用正規表示式
正規表示式不僅靈活還很強大,用它能很簡潔的實現很多實用的功能,下面簡單列舉一些:
3.1給字串加千分符
1 2 3 4 5 |
function spli(str){ var re = /(?=(?!b)(d{3})+$)/g; return str.replace(re,','); } console.log(spli(str)); |
其中的(?=exp)用來匹配exp前面的位置,(?!exp)匹配後面跟的不是exp的位置,他們都是零寬斷言。
如果要是不用正規表示式的話,程式碼會多些:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
var str = '12345432'; //->[] function spli(str) { var iNum = str.length % 3; //->0,1,2 var prev = ''; var arr = []; var iNow = 0; var tmp = ''; //千分號是從後向前三位三位加的,所以把三位餘出來的從前面提取到 if (iNum != 0) { prev = str.substring(0, iNum); arr.push(prev); } //取到多餘部分後面的 str = str.substring(iNum); for (var i = 0; i) { iNow++; tmp += str[i]; if (iNow == 3 & tmp) { //陣列裡面放的是三位的數 arr.push(tmp); tmp = ''; iNow = 0; } } return arr.join(','); } console.log(spli(str)); |
3.2字串中出現次數最多的字元
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
var str = 'kkkkkkkaaakkkkkkaaaaasddd'; function most(str) { //排序,正則匹配子項 var arr = str.split(''); arr.sort(); str = arr.join(''); // 1匹配前面相同的,也就是說跟(w)相同的 var re = /(w)1+/g; var num = 0; var value = ''; //這裡的$0就是找到的重複的整體 str.replace(re, function ($0, $1) { //alert($0); if (num.length) { num = $0.length; value = $1; } }); return '出現次數最多的字元是' + value + '出現了' + num + '次'; } 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常用正規表示式]
參考資料:
這裡我只是總結了正規表示式相關的方法和屬性,強烈建議閱讀:正規表示式30分鐘入門教程 它教會你如何寫正規表示式,再結合文章上面提到的方法,寫著寫著,正則就不是那麼遙不可及了,非常實用喔。