day07---正则表达式

什么是正则表达式?
正则表达式(Regular Expression)是用于匹配字符串中字符组合的模式。
通常用来查找、替换那些符合正则表达式的文本,许多语言都支持正则表达式。
在 JavaScript中,正则表达式也是对象

正则表达式在 JavaScript中的使用场景:
例如验证表单:手机号的格式(匹配) 比如用户名: /^[a-z0-9_-]{3,16}$/
过滤掉页面内容中的一些敏感词(替换),或从字符串中获取我们想要的特定部分(提取)等 。

正则表达式的语法

let 变量名 = /表达式/
其中 / / 是正则表达式字面量

正则表达式的方法

判断是否有符合规则的字符串:test() 方法
如果正则表达式与指定的字符串匹配 ,返回true,否则false

        // 定义正则表达式
        let reg = /前端/
        let reg2 = /a/

        console.log(reg.test('abc')) // 测试字符串abc中是否有符合正则的结果, 结果为false
        console.log(reg.test('大家都在学习前端')) // true

搜索匹配字符串:exec() 方法

        let str = `大家都在学习前端呢,薪资很高`
        let str2 = `大家都在学习php呢,还不错哦`

        console.log(reg.exec(str)) // 是个数组
元字符

普通字符: 大多数的字符仅能够描述它们本身,这些字符称作普通字符,例如所有的字母和数字。

元字符(特殊字符) 是一些具有特殊含义的字符,可以极大提高了灵活性和强大的匹配功能。
比如,规定用户只能输入英文26个英文字母,普通字符的话 abcdefghijklm….. 但是换成元字符写法: [a-z]

为了方便记忆和学习,我们对众多的元字符进行了分类:

1.预定义类:

预定义类还有:. 匹配除换行符之外的任何单个字符,.表示匹配.本身

2.字符类: (比如 \d 表示 0~9)

[ ] 里面加上 - 连字符,使用连字符 - 表示一个范围
[a-z] 表示 a 到 z 26个英文字母都可以
[a-zA-Z] 表示大小写26个英文字母都可以
[0-9] 表示 0~9 的数字都可以

[ ] 里面加上 ^ 取反符号
[^a-z] 匹配除了小写字母以外的字符
注意要写到中括号里面

3.边界符:(表示位置,开头和结尾,必须用^什么开头,用什么结尾$)

正则表达式中的边界符(位置符)用来提示字符所处的位置,主要有两个字符
^:表示匹配行首的文本(以谁开始)
$:表示匹配行尾的文本(以谁结束)
两个边界符一起使用表示必须是精确匹配

4.量词: (表示重复次数)

量词用来 设定某个模式出现的次数
*:重复0次或更多次
+:重复一次或更多次
?:重复0次或1次
{n}:重复n次
{n,}:重复n次或更多次
{n,m}:重复n到m次
注意: 逗号左右两侧千万不要出现空格

案例:用户名验证案例

需求:用户名要求用户英文字母,数字,下划线或者短横线组成,并且用户名长度为 6~16位 分析:
①:准备好正则表达式 /^[a-zA-Z0-9-_]{6,16}$/
②:当表单失去焦点来验证
③:如果符合正则规范, 则让后面的span标签添加 right 类.
④:如果不符合正则规范, 则让后面的span标签添加 wrong 类.

// 验证用户名案例
        let input = document.querySelector('input')

        // wrong 和 right 类名分别表示错误和正确的提示

        // 要求:用户名要求用户英文字母,数字,下划线或者短横线组成,并且用户名长度为 6~16位

        // 分析
        //  1. 给input注册blur事件(失去焦点事件)
        //  2. 获取输入框的内容
        //  3. 定义正则(要求来制定)
        //  4. 通过正则来做测试,看输入的内容是否有通过正则校验
        //  5. 校验结果在span上提示 (用类名操作 right类名    wrong类名)

        // 1. 
        input.addEventListener('blur', function () {
            // 2. 
            console.log(input.value)

            // 3. 表单的正则表达式一定要记得精确匹配   别落下 ^  $ 
            let reg = /^[a-zA-Z0-9_-]{6,16}$/

            // 使用变量存获取到的span
            let spanObj = input.nextElementSibling

            // 4. 
            // reg有test方法可以来做测试
            // console.log(reg.test(input.value)) // true false
            if (reg.test(input.value)) {
                // 说明通过
                //  className 设置的时候会有覆盖问题
                spanObj.className = 'right'
            } else {
                // 没通过
                spanObj.className = 'wrong'
            }
        })

案例:昵称案例

需求:要求用户只能输入中文 分析:
①:准备好这种正则表达式 /^[\u4e00-\u9fa5]{2,8}$/
②:当表单失去焦点就开始验证.
③:如果符合正则规范, 则让后面的span标签添加 right 类.
④:如果不符合正则规范, 则让后面的span标签添加 wrong 类.

  // 验证用户名案例
        let input = document.querySelector('input')

        // 中文范围的正则 [\u4e00-\u9fa5]

        // input.addEventListener('blur', function () {
        //     // 内容
        //     // input.value
        //     // 正则
        //     let reg = /^[\u4e00-\u9fa5]{2,6}$/

        //     let spanObj = input.nextElementSibling

        //     if (reg.test(input.value)) {
        //         // 通过
        //         spanObj.className = 'right'
        //     } else {
        //         // 未通过
        //         spanObj.className = 'wrong'
        //     }
        // })



        // 使用change事件来实现的
        // input.addEventListener('change', function () {
        //     // 内容
        //     // input.value
        //     // 正则
        //     let reg = /^[\u4e00-\u9fa5]{2,6}$/

        //     let spanObj = input.nextElementSibling

        //     if (reg.test(input.value)) {
        //         // 通过
        //         spanObj.className = 'right'
        //     } else {
        //         // 未通过
        //         spanObj.className = 'wrong'
        //     }
        // })


        // 只要失去了焦点就触发
        // input.addEventListener('blur', function () {
        //     console.log('blur 失去了焦点')
        // })

        // 拓展: change 失去焦点 还有内容改变了才会触发
        // input.addEventListener('change', function () {
        //     console.log('change 事件触发了')
        // })


        // ============== 使用change事件来实现手机号的校验 ============== 
        //  制定手机号的要求
        //  11位数字    开头是1      第二位有限制 不能是 0 1 2 的数字 

        input.addEventListener('change', function () {
            // 内容
            // input.value
            // 正则 要求手机号的要求来制定
            // let reg = /^1[^012]\d{9}$/  // error 有问题的正则
            let reg = /^1[3-9]\d{9}$/

            let spanObj = input.nextElementSibling

            if (reg.test(input.value)) {
                // 通过
                spanObj.className = 'right'
            } else {
                // 未通过
                spanObj.className = 'wrong'
            }
        })

字符替换和修饰符

替换 replace 替换
语法:
字符串.replace(/正则表达式/,‘替换的文本’)

        let str = '  abc def  abcx  yzABCsff  '
        // 需求:将所有的空格去除掉
        console.log(str.replace(/a/g, 'x'))

修饰符
修饰符约束正则执行的某些细节行为,如是否区分大小写、是否全局匹配搜索等
语法:
/表达式/修饰符

i 是单词 ignore 的缩写,正则匹配时字母不区分大小写
g 是单词 global 的缩写,匹配所有满足正则表达式的结果

        let str = '  abc def  abcx  yzABCsff  '
        console.log(str.replace(/a/gi, 'x'))  // 所有的a换成x

案例:过滤敏感字

需求:要求用户不能输入敏感字 比如,老师上课很有**
分析:
①:用户输入内容
②:内容进行正则替换查找,找到敏感词,替换成**
③:要全局替换使用修饰符 g

 let btn = document.querySelector('button')
        let textarea = document.querySelector('textarea')
        let div = document.querySelector('div')

        btn.addEventListener('click', function () {
            // 将文本域的内容设置到div中展示
            // div.innerHTML = textarea.value

            // 需求:过滤用户输入的内容
            //      敏感词: 激情 或 基情字眼替换成 **   使用replace实现替换

            div.innerHTML = textarea.value.replace(/激情|基情/g, '**')
        })
```sss

你可能感兴趣的:(day07---正则表达式)