正则表达式
正则表达式,是我们日常开发中经常会运用到的。当然对于一些复杂的正则表达式,当然可以通过网络去搜索可以节约时间;对于运用到的一些简单的,自己动手去写可以节约一些时间,也是自己技术能力体现。对于正则的基础知识我这里就不做介绍了,要想了解基础知识,可以去翻阅菜鸟教程它的表达会比写的更加清楚,我主要给大家介绍如何写一段性能比较好的正则表达式,也就是优雅的写一段正则表达式,也是我们日常工作经常会用的。
- 在这里我分为两中一是斜杠匹配式,二是对象匹配式:
- 斜杠匹配(/^]$/):
- 对象正则:通过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库链接)
- 菜鸟教程