字符串是编程时涉及到的最多的一种数据结构,对字符串进行操作的需求几乎无处不在,正则表达式是一种用来匹配字符串的强有力的武器。
基础概念
^ 开头匹配
$ 结尾匹配
/d 匹配数字
/w 可以匹配一个字母或者数字
\s 匹配一个空格(包括tab等空白符)
. 可以匹配任意字符
- 任意字符
- 至少一个字符
? 代表 0或1个字符
{n} n个字符
{n,m} n~m个字符
特殊字符在正则表达式中需要转义、' \ ',示例:' - '转义为 '-'.
包括:$、( )、*、+、.、[、?、\、^、{、|
现在匹配一个固定电话、如:010-123456
\d{3}\-\d{3,8}
匹配一个手机号码
^1[3|4|5|7|8|9][0-9]\d{8}$
匹配中文: [\u4e00-\u9fa5]
英文字母:[a-zA-Z]
数字:[0-9]
我们平时使用较多的、
去掉字符串的空格," s m l " --> "sml"
非正则实现:
function trim(str) {
let strArr = []
for (let i = 0; i < str.length; i++) {
if (str[i] !== ' ') {
strArr.push(str[i])
}
}
return strArr.join("")
}
用正则实现:
function trim(str) {
return str.replace(/(\s)/g, "")
}
我要解决的问题、
1、姓名:2-10位中文
^[\u4E00-\u9FA5]{2,10}$
2、手机号:支持7、8、11、12位数字
^\d{7}$|^\d{8}$|^\d{11}$|^\d{12}$
3、详细地址:0-60位汉字
^[\u4E00-\u9FA50-9]{2,60}$
4、货物名称:1-20位中文
^[\u4E00-\u9FA5]{1,20}$
5、总件数:1-5594
/(^[1-4]\d{3}$)|(^5[0-4]\d{2}$)|(^55[0-8]\d{1}$)|(^559[0-4]$)/
6、重量、体积:0-999.99
^([0-9]{1,3})+(.[0-9]{2})?$
7、金额:1-99999999(整数)
^[1-9]\d{0,7}$
8、备注:0-30字
^[\u4E00-\u9FA50-9]{0,30}$
.*?
是正则固定搭配用法,表示[非贪婪匹配]模式,尽可能匹配少的
看完这些、其实,我们日常所用的也几乎止步于此,应该算入门了、
任何技能都在于实践!
看看正则其他玩法、
数字格式化问题,1234567890 --> 1,234,567,890
非正则实现:
function formatCash(str) {
let formattedStr = ""
for (let i = 0; i < str.length; i++) {
if ((i + 1) % 4 === 1 && i !== 0) {
formattedStr += " "
}
formattedStr += str[i]
}
return formattedStr
}
正则实现:
function formatCash(str) {
let strRes = str.replace(/(\d{4})(?=[^$])/g, "$1 ")
return strRes
}
?=exp 零宽度正预测先行断言 以下正则表达式匹配以ed结尾的单词的前面部分:\b\w+(?=ed\b)。 ?<=exp 又称为零宽度正回顾后发断言 以下正则表达式匹配以an开头的单词的后面部分,即匹配单词除了字符串an之外的部分:(?<=\ban)\w+\b
再来一个面试中经常被问的、字符串数组去重。
es6写法:
let strArr=["a","b","c","a","b","c"]
function unique(arr){
return [...new Set(arr)]
}
es5写法:
function unique(arr) {
return arr.filter(function(ele, index, array) {
return array.indexOf(ele) === index
})
}
正则表达式实现:
function unique(arr) {
return arr.sort().join(",,").
replace(/(,|^)([^,]+)(,,\2)+(,|$)/g, "$1$2$4").
replace(/,,+/g, ",").
replace(/,$/, "").
split(",")
}
这里有了一个多次出现的词,replace(),我们了解下replace,来自W3C.
replace() 方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串。
stringObject.replace(regexp/substr,replacement)
最近的一个需求、确定微信浏览器是否大于等于5.0
function wxVersion(str){
const ua = window.navigator.userAgent.match(/micromessenger\/[\d.]+/gi)
return (ua+"").replace(/[^0-9.]/ig,"")
}