正則表達式
正則表達式,是我們日常開發中經常會運用到的。當然對於一些複雜的正則表達式,當然可以通過網絡去搜索可以節約時間;對於運用到的一些簡單的,自己動手去寫可以節約一些時間,也是自己技術能力體現。對於正則的基礎知識我這裏就不做介紹了,要想了解基礎知識,可以去翻閱菜鳥教程它的表達會比寫的更加清楚,我主要給大家介紹如何寫一段性能比較好的正則表達式,也就是優雅的寫一段正則表達式,也是我們日常工作經常會用的。
- 在這裏我分爲兩中一是斜槓匹配式,二是對象匹配式:
- 斜槓匹配(/^]$/):
- 對象正則:通過new一個正則對象
new RegExp()
,
- 其實大家心裏有個疑問,那就是正則的數據類型是什麼呢,其實我心裏也很好奇,我一起通過代碼來實現吧:
```
typeof /[0-9]/
結果:"object"
type new RegExp('\s+', 'g')
結果:“object”
```
結論:通過上述代碼我可以知道正則表達式屬於引用類型,引用類型,我們都知道他是存放在堆內存裏,有關詳細關於內存管理的內容,會在接下來的博客進行介紹。
一:正則相關概念:
- 元字符:
\w(字母數字下劃線), \W(非字母數字下劃線),.(所有), * (0或多次),+(一次或多次), ?(0或1次), \n\r(換行回車) , \b\B(單詞邊界,非單詞邊界),\s\S\d\D
etc. - 語法:普通正則,動態正則,分組匹配
- 普通正則:
/\s+/g
全局匹配空格 - 動態正則:
var str = 'ne2' var n = /^[a-zA-Z0-9]+/ var reg = new RegExp(n)//可以動態創建表達式; console.log( reg.test(str)) //true
- 普通正則:
- 分組匹配
var str = 'ne2'
var n = /(^[a-zA-Z]+)(\d+$)/g
var reg = new RegExp(n)//可以動態創建表達式;
reg.test(str)
console.log(RegExp.$1, RegExp.$2) // ne 2
二: 日常工作中會運用到正則方法:
- test()正則檢測
- replace()正則替換
- split() 正則切割
上面兩種方法是我們工作可能經常會用的兩個方法
當然還有其他方法:match/exec/search
其實我給出上面六種方法中:test和exec是RegExp.prototype的原型方法,而其他四種則是正則原型的Symbol函數裏的方法,這種是無法直接通過RegExp.prototype.relace進行獲取的。有關symbol方法的理解也會放到後面章節去寫。 - 屌絲們看圖:
1. test()是屬於正則方法,可以通過RegExp.prototype.test獲取方法;
const reg = /^\d+$/g
const value = 123213
console.log(reg.test(value))//true
上面就檢測是否是數字類型;
開發會用到的正則校驗:
- 手機號:
/^1[34578]\d{9}$/g
注:這個主要針對國內手機號用戶進行判斷,如果涉及到國際業務,可以採用該插件libphonenumber-js(github庫鏈接) - 郵箱:
/^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
- 微信號:
/^[a-zA-Z-]([-_a-zA-Z0-9]{5,19})+$/
- url:
/^(https?:\/\/)?[a-zA-Z-_]+\.?[a-zA-Z0-9-_]*\.[a-zA-Z_-]+/g
可以根據業務需求去修改 - 正整數:
/^[1-9]\d*$/
- 用戶名:
/^\w{4,16}/g
用戶名4到16位(數字,字母,下劃線,減號) - 中文校驗:
/[\u4E00-\u9FA5]/g
2. replace()這個方法可進行正則替換
relace這個應用還是比較廣泛;
- 替換空字符串:
var str = 'scott nue jie typr kf ytr kfljei 126'
var reg = new RegExp(/\s+/,'g')
str = str.replace(reg,' ')
console.log(str)// scottnuejietyprkfytrkfljei126
- 手機號加密:
replace(/(^\d{3})(\d{4})(\d{4}$)/g, "$1****$3")
- 文本加密算法
function textEncryption(text, targetStr, digit){
targetStr = targetStr || '*';
digit = digit || 4;
text = text + '';
var newTargetString = ''
for(var i = 0;i<digit;i++){
newTargetString += targetStr;
}
var len = text.length;
var baseNumber = (len-digit)/2
var firstNumber = Math.floor(baseNumber);
var lastNumber = Math.ceil(baseNumber);
var reg = new RegExp(`(^.{${firstNumber}})(.{${digit}})(.{${lastNumber}}$)`, 'g');
return text.replace(reg, `$1${newTargetString}$3`);
}
- replace(a,b),a,表示父級需要匹配替換的參數(正則|string), b,替換的類型,代碼如上;
- replace(a,function(res,index){});
a,表示父級需要匹配替換的參數(正則|string);
res,表示正則匹配的字符
index,正則匹配字符下標
var str = 'fhdsfj ksjdflkj jklsdjflk'
str = str.replace(/j/g,function(res,index){
console.log(res)
console.log(index)
return '文'+res
})
console.log(str)
參考文檔
- libphonenumber-js(npm庫鏈接)
- 菜鳥教程