正则表达式
下面通过一个简单的需求讲述一下正则的强大。比如字符串里找到对应的数字,并放进一个数组中
// 方式一:通过正常js去处理
function getNumber(str) {
let arr = []
let temp = ""
for (let i = 0; i < str.length; i++) {
if (!isNaN(str[i])) {
// 是数字
temp += str[i]
} else {
// 是字母
if (temp !== "") {
arr.push(temp)
temp = ""
}
}
}
if (temp !== "") {
arr.push(temp)
}
return arr
}
const str = "fshshfsf34534fgsfhs353sdadga323zdsd353"
const res = getNumber(str)
console.log(res) // ['34534', '353', '323', '353']
// 方式二: 通过正则处理
const str = "fshshfsf34534fgsfhs353sdadga323zdsd353"
const reg = /\d+/g
const arr = str.match(reg)
console.log(arr) // ['34534', '353', '323', '353']
创建方式
// 方式一:字面量创建
const reg = /\d+/
// 方式二:构造函数创建,可以接受一个变量
const reg = new RegExp('\\d+')
正则方法
- test
返回是否含有符合条件的值
const str = "fshshfsf34534fgsfhs353sdadga323zdsd353"
const reg = /\d+/
const res = reg.test(str)
console.log(res) // true
- exce
返回查到符合条件的值,忽略全局匹配。如果需要全局匹配则执行多次,它可以根据上一次查找的结果继续匹配。
const str = "fshshfsf34534fgsfhs353sdadga323zdsd353"
const reg = /\d+/
const res = reg.exce(str)
console.log(res) // 34534
const res1 = reg.exce(str)
console.log(res1) // 353
字符串方法
- split
把字符串分割为字符串数组
const str = "fdafdafdsfdsafsddarer"
// 与const arr = str.split('a')相同
const arr = str.split(/a/)
console.log(arr) // ['fd', 'fd', 'fdsfds', 'fsdd', 'rer']
- replace
在字符串中查找匹配的子串,并替换与正则表达式匹配的子串
const str = "wesdTMMvewasTMM"
// 部分替换
const str1 = str.replace("TMM", "***")
console.log(str1) // wesd***vewasTMM
const str = "Mr Blue has a blue house and a blue car"
// 全局替换,常用来做一些敏感词过滤
// /blue/gi可以忽略大小写, /blue/g有大小写区分
const str1 = str.replace(/blue/g, "red")
console.log(str1) // Mr Blue has a red house and a red car
// 敏感词
const str = "据中国教育部数据显示...归国热潮下,海归就业的供需市场如何,成为留学人员与国内用人单位的共同关注。"
const reg = /教育部|人员/g
// let res = str.replace(reg, "*")
const res = str.replace(reg,function(arg){
return "*".repeat(arg.length)
})
console.log(res) // 据中国***数据显示...归国热潮下,海归就业的供需市场如何,成为留学**与国内用人单位的共同关注。
- search
匹配符合条件的索引值的位置,如果找不到就返回-1
const str = "fshshfsf34534fgsfhs353sdadga323zdsd353"
const reg = /\d+/
const res = str.search(reg)
console.log(res) // 8
- match
返回查到符合条件的值,全局匹配和非全局匹配存在一定的差距。忽略全局匹配
const str = "fshshfsf34534fgsfhs353sdadga323zdsd353"
const reg = /\d+/g
const arr = str.match(reg)
console.log(arr) // ['34534', '353', '323', '353']
元字符
正则中有特殊含义的非字母字符
. * + ? $ ^ | \ () [] {}
字符 | 描述 |
---|---|
( ) | 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 ( 和 )。 |
* | 匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 *。 |
+ | 匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 +。 |
. | 匹配除换行符 \n 之外的任何单字符。要匹配 . ,请使用 . 。 |
[ | 标记一个中括号表达式的开始。要匹配 [,请使用 [。 |
? | 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 ?。 |
\ | 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, ‘n’ 匹配字符 ‘n’。‘\n’ 匹配换行符。序列 ‘\’ 匹配 “”,而 ‘(’ 则匹配 “(”。 |
^ | 匹配输入字符串的开始位置,除非在方括号表达式中使用,当该符号在方括号表达式中使用时,表示不接受该方括号表达式中的字符集合。要匹配 ^ 字符本身,请使用 ^。 |
{ | 标记限定符表达式的开始。要匹配 {,请使用 {。 |
| | 指明两项之间的一个选择。要匹配 |,请使用 |。 |
// 以下两种方式相同
const reg = /a|b/g
const reg = /[ab]/g
// 以下两种方式相同
const reg = /\d+/g
const reg = /[0-9]+/g
// 替换cM或km(不区分大小写)为米
const str = "this knife is 5cM"
const reg = /[kKCc]?[Mm]/
const res = str.replace(reg, "米")
console.log(res) // this knife is 5米
// 转换时间格式 将2019-10-19 转换成 19/10/2019
const mytime = "2019-10-19"
// 通过()分组
const reg = /(\d{4})-(\d{1,2})-(\d{1,2})/g
const res = mytime.replace(reg, "$3/$2/$1")
console.log(res) // 19/10/2019
命名分组
const str = "$name=zhangsan&age=20"
const reg = /\$(?<str>\w+)/
const res = str.match(reg)
console.log(res.groups.str) // name
一些常见的正则表达式
- 姓名
const reg = /^[a-zA-Z\u4E00-\u9FA5\uf900-\ufa2d·s]{2,20}$/
console.log(reg.test('唐三')) // true
- 手机号
// 简单款
const reg = /^1[3-9]\d{9}$/
console.log(reg.test(13512125454)) // true
// 严谨款
const reg = /^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$/
console.log(reg.test(13512125454)) // true
- 邮箱
const reg = /^[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/
console.log(reg.test('10676215@qq.com')) // true
console.log(reg.test('10676215qq.cn')) // false
- 身份证
const reg = /^[1-9]\d{5}([1][9]\d{2}|[2][0][0|1]\d)([0][1-9]|[1][0|1|2])([0][1-9]|[1|2]\d|[3][0|1])\d{3}(\d|[X])$/