在此之前的項目開發中,發現利用正則方法能夠提高開發效率,所以看著教程和博客,自己重新學習了一遍正則,並記錄下來。 正則聲明 構造函數聲明方式 字面量聲明方式 tip:參數解釋: pattern:模式,要匹配的內容。 modifiers:修飾符 i:ignore。不區分大小寫的匹配 g:global。 ...
在此之前的項目開發中,發現利用正則方法能夠提高開發效率,所以看著教程和博客,自己重新學習了一遍正則,並記錄下來。
正則聲明
- 構造函數聲明方式
var pat = new RegExp(pattern,modifiers);
- 字面量聲明方式
var pat = /pattern/modifiers
- tip:參數解釋:
pattern:模式,要匹配的內容。
modifiers:修飾符- i:ignore。不區分大小寫的匹配
- g:global。全局匹配
- m:多行匹配
ps:這三個可以連用,無順序之分。
var reg = new RegExp('abc','ig'); // 代表不區分大小寫並且全局匹配abc。 var reg = /abc/m // 代表多行匹配abc。
正則字元
- ^ 表示匹配輸入字元串的開始位置
^abc => 代表整個字元中匹配首個字元串為abc的
- $ 表示匹配輸入字元串的結束位置
abc$ => 代表整個字元中匹配尾部字元串為abc的
- . 表示匹配換行符\n之外的任何字元
. <=> \w\d\r\f\t\v
ps:[.] 這種模式代表只匹配.字元,等價於'.' - [] 表示字元集合。匹配所包含的任意一個字元
[abc] => apple也符合[abc]中的a
[abcdef] => football也符合[abcdef]的a,b,f
[^abc] => 代表不包含abc的任何字元都可匹配
ps: ^abc與[^abc]的區別:- ^abc 代表整個字元中匹配首個字元串為abc的
- [^abc] 代表不包含abc的任何字元都可匹配
- {} 表示匹配字元的數量,量詞
a{2} => 代表匹配確定a只能出現兩次
- {n} 匹配確定的n次
a{2} => 代表匹配確定a只能出現兩次 aa
- {n,} 表示至少匹配n次
a{2,} => 代表匹配確定a至少出現兩次 aa,aaa,aaaa
- {m,n} 表示最少出現m次,最多出現n次
a{2,4} => 代表匹配確定a最少出現2次,最多出現4次 aa,aaa,aaaa
- {n} 匹配確定的n次
- | 表示或的關係,兩者都可匹配
a|b => 代表a和b都可以匹配到
- () 表示分組符,一代表匹配裡面的字元並獲取這一匹配。二代表優先順序
(partten) => 匹配pattern並獲取這一匹配
^(0|[1-9][0-9]*)$ => 代表零和非零開頭的數字
ps:(?:pattern) => 匹配pattern但不獲取匹配結果。 - + 表示前面的字元必須至少出現一次(1次或多次)
a+bc <=> abc | aabc | aaabc
ps:+ 等價於 {1,} - * 表示字元可以不出現,也可以出現1次或多次
a*bc <=> bc | abc | aabc
ps: * 等價於 {0,} - ? 表示前面的字元最多只可以出現一次(0次或1次)
a?bc <=> bc | abc
常用字元和非列印字元
- \d 匹配一個數字字元
\d 等價於 [0-9] (\d <=> \[0-9\]
) - \D 匹配一個非數字字元
\D 等價於 [^abc] (\D <=> \[^0-9\]
) - \w 匹配字母,數字,下劃線
\w <=> \[A-Za-z0-9_\]
- \W 匹配非字母,數字,下劃線
\W <=> \[^A-Za-z0-9_\]
- \b 匹配一個單詞邊界,也就是單詞和空格間的位置
- \B 匹配一個非單詞邊界
eg: /ter\b/ => 可匹配chapter,不能匹配terminal - \n 換行符
- \r 回車符
- \f 換頁符
- \t 製表符
- \v 垂直製表符
- \s 匹配任何空白字元,包括空格,製表符,換頁符
\s <=> \[\f\n\v\t\r\]
- \S 匹配任何非空白字元
\S <=> \[^\f\n\r\v\t\]
正則方法
var reg = new RegExp()
var str = 'abc'; typeof str == 'string'
reg.test(str); 用來測試某個字元串是否與正則匹配,返回值是一個布爾值,匹配為true,不匹配為false。
var reg = /^a?b+c*/ var str1 = 'aabbcc' var str2 = 'bc' reg.test(str1) // false ?代表的是最多出現一次 reg.test(str2) // true
reg.compile(str) 能夠對正則表達式進行編譯,方便多次調用,提高性能。參考菜鳥教程的說法:
該方法可以編譯指定的正則表達式,編譯之後的正則表達式執行速度將會提高,如果正則表達式多次被調用,那麼調用compile方法可以有效的提高代碼的執行速度,如果該正則表達式只能被使用一次,則不會有明顯的效果。
var str="Every man in the world! Every woman on earth!"; patt=/man/g; str2=str.replace(patt,"person"); console.log(str2); // Every person in the world! Every woperson on earth! patt=/(wo)?man/g; patt.compile(patt); str2=str.replace(patt,"person"); console.log(str2); // Every person in the world! Every person on earth!
reg.exec(str) 接受一個字元串,返回一個數組,否則返回null。
返回值是數組 解釋:
1 如果有多個匹配的話
1 此數組的第0個元素是與正則表達式相匹配的文本。
2 第一個元素是與reg的第一個子表達式相匹配的文本,(如果有的話)
3 第二個元素是reg的第二個子表達式相匹配的文本,(如果有的話)
4……
2 index 匹配文本的第一個字元的索引
3 input 是被檢索的字元串strvar str = '2018ceshi2019' var reg = /(\d)(\w)/; var result = reg.exec(str) console.log(result);//["20", "2", "0", index: 0, input: "2018ceshi2019"]
var str = 'The Quick Brown Fox Jumps Over The Lazy Dog' var reg = /quick\s(brown).+?(jumps)/ig; var result = reg.exec(str); console.log(result); // ["Quick Brown Fox Jumps", "Brown", "Jumps", index: 4, input: "The Quick Brown Fox Jumps Over The Lazy Dog", groups: undefined] // result [0] 匹配的全部字元串 'Quick Brown Fox Jumps' // [1],[2],...[n] 括弧中的分組捕獲 [1] = Brown [2] = Jumps // index :匹配到的字元位於原始字元串的基於0的索引值 4 // input : 原始字元串 The Quick Brown Fox Jumps Over The Lazy Dog
ps:如果不需要捕獲分佈的內容,則在不需要分組捕獲裡面加上?:,此表示匹配不捕獲。
var reg = /quick\s(?:brown).+?(?;jumps)/ig;
這樣就不會有[1],[2],...[n]的分組捕獲了。str.match(reg) 在字元串中搜索符合規則的內容,成功則返回數組內容,失敗則返回null
由這四個例子可知,全局匹配,得出的結果是一個數組,如果不是全局匹配,當找到數字123,它就會停止了。就只會彈出123,類似與exec()的結果。加上全局匹配,就會從開始到結束一直去搜索符合規則的。如果沒有加號,匹配的結果就是["1", "2", "3", "4", "5", "6", "7", "8", "9"],有了加號,每次匹配的數字就是至少一個了。var str = 'abc123def45g6hijkl789'; var reg1 = /\d+/g; // 每次匹配至少一個數字 且全局匹配 console.log( str.match(reg1)); // [123,45,6,789] var reg2 = /\d+/; console.log(str.match(reg2)); // ["123", index: 3, input: "abc123def45g6hijkl789", groups: undefined] var reg3 = /\d/; console.log(str.match(reg3));//["1", index: 3, input: "abc123def45g6hijkl789", groups: undefined] var reg4 = /\d/g; console.log(str.match(reg4)) // ["1", "2", "3", "4", "5", "6", "7", "8", "9"]
str.search(reg) 在字元串中搜索符合正則內容的索引,如果不存在,則返回-1。
var str = 'abcdefg'; var reg1 = /B/i; console.log(str.search(reg1)) // 1 var reg2 = /B/; console.log(str.search(reg2)) // -1
str.replace(reg,new str/callback)
參數解釋: 第一個參數reg:要匹配的正則內容,
第二個參數new str/callback。callback,回調函數里也有三個參數:1 匹配的字元,2 匹配字元的索引,3 源字元串。var str = '我愛北京天安門,天安門上太陽升' var reg = /北京|天安門/g console.log(str.replace(reg,'*')) // 我愛**,*上太陽升
var str = "我愛北京天安門,天安門上太陽升。"; var re = /北京|天安門/g; // 找到北京 或者天安門 全局匹配 var str2 = str.replace(re,function(str){ console.log(str); //用來測試:函數的第一個參數代表每次搜索到的符合正則的字元,所以第一次str指的是北京 第二次str是天安門 第三次str是天安門 var result = ''; for(var i=0;i<str.length;i++){ result += '*'; } return result; //所以搜索到了幾個字就返回幾個* }); console.log(str2) //我愛*****,***上太陽升
額外例子:
1 找重覆項最多的字元個數
var str = 'aibbicidhdieifigbdihdaii'; var arr = str.split(''); //把字元串轉換為數組 str = arr.sort().join(''); //首先進行排序,這樣結果會把相同的字元放在一起,然後再轉換為字元串 console.log(str); // aabbbcddddefghhiiiiiiiii var value = ''; var index = 0; var re = /(\w)\1+/g; //匹配字元,且重覆這個字元,重覆次數至少一次。 str.replace(re,function($0,$1){ console.log($0); //代表每次匹配成功的結果 : aa dd jj kk l sssssssssssssssss console.log($1); //代表每次匹配成功的第一個子項,也就是\w: a d j k l S if(index<$0.length){ //如果index保存的值小於$0的長度就進行下麵的操作 index = $0.length; // 這樣index一直保存的就在最大的長度 value = $1; //value保存的是出現最多的這個字元 } }); console.log('最多的字元:'+value+',重覆的次數:'+index); // 最多的字元:i,重覆的次數:9
大寫數字替換小寫數字
var str = "2019"; var a = ["零","壹","貳","叄","肆","伍","陸","柒","捌","玖"]; str = str.replace(/\d/g, function () { return a[arguments[0]]; }); console.log(str);//貳零壹玖
結尾
通過學習正則,發現正則不是很難,主要是因為沒有往正則方面去想,正則無非就是幾個字元加上方法就能匹配自己想要匹配的結果,在於嘗試,嘗試多了,自然而然就學會合理在項目中使用正則。
以上是我學習正則記錄的筆記,我把筆記整理到了github上了,歡迎閱讀,好的話給個star。大家如果覺得我有什麼做的不對的,請下方評論或私信,一起進步加油!參考資料