正则表达式

正则表达式

下面通过一个简单的需求讲述一下正则的强大。比如字符串里找到对应的数字,并放进一个数组中

// 方式一:通过正常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])$/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值