写点什么

正则表达式 (二)

作者:Jason199
  • 2022 年 7 月 08 日
  • 本文字数:3105 字

    阅读完需:约 10 分钟

正则表达式(二)

正则表达式的标识符

标识符是写在正则表达式的外面, 用来修饰整个正则表达式的

        标识符

          1. i   忽略大小写

/ /1. i 忽略大小写     const reg = /^[abcd]*$/;     console.log(reg.test('abcdacbd'));     console.log(reg.test('abcdA'));
复制代码

          2. g   全局

匹配和捕获的时候, 都是只能找到第一个

       当他有全局标识符的时候, 你捕获第二次会从第一次的结束位开始查找

    知道找不到了, 返回 null

     再后面依次的时候, 又回到 [0] 位置开始捕获

   匹配和捕获都是影响下一次开始位的

   const str = 'abc123abc456abc789abc'     const reg = /\d{3}/g     console.log(reg.exec(str)) // 结束位是 [5]     console.log(reg.exec(str)) // 开始位就是 [6]     console.log(reg.test(str)) // 开始位就是 [12]
复制代码

          3. y   粘性全局

        使用方法:

          /abcd/igy

          new RegExp('abcd', 'igy')

 const str = '123456abc789abc'  const reg = /\d{3}/y    console.log(reg.exec(str)) // g 123     console.log(reg.exec(str)) // g 456
复制代码

两种创建正则表达式的区别

 1. 字面量创建

          使用方法: var reg = /abcd/igy

          不能进行字符串拼接

          书写基础元字符的时候直接写 \xx

// 1. 进行字符串拼接     var str = 'hello'// 字符串拼接完毕就变成了字符串, 不是正则, 不能使用 test 和 exec 方法     var reg = '/' + str + '/'     console.log(reg.test())// 因为 RegExp 的第一个参数就是传递一个字符串类型    var reg = new RegExp(str + ' world')     console.log(reg)
复制代码

 2. 内置构造函数创建

          + 语法: var reg = new RegExp('abcd', 'igy')

          + 可以进行字符串拼接

          + 书写基础元字符的时候要书写 \\xx

 // 2. 书写基础元字符     var reg = /\d\s\w/     console.log(reg)     var reg = new RegExp('\\s\\d\\w')     console.log(reg)
复制代码

3.字符串

        字符串里面也有转义符号

        是 \(反斜杠)

        书写 n 的时候, 就表示文本 n

        书写 \n 的时候, 就表示换行的意思

        字符串里面书写 \s 的时候, 他会把 s 转换成有意义的内容

          但是 \s 确实没有实际意义

          变成了一个普通 s 文本

        当你再字符串里面书写 \ 的时候, 表示转义符号

          但是当你书写 \\ 的时候, 表示一个 \ 文本

4.字符串和正则合作的方法

        都是字符串的常用方法, 只不过参数位置可以写正则

1. search()

        使用方法:

          1. 字符串.search(字符串片段)

          2. 字符串.search(正则表达式)

        返回值:

          如果有就是对应的索引

          如果没有就是 -1

// 1. search     const str = 'sada123sjdk'     console.log(str.search('123'))     console.log(str.search(/\d{3}/))
复制代码

2. replace()

        使用方法:

          1. 字符串.replace(字符串片段, 要替换的内容)

          2. 字符串.replace(正则表达式, 要替换的内容)

        返回值:

          1. 只能替换第一个查找到的内容, 返回替换好的字符串

          2. 没有全局标识符 g 的时候, 只能替换第一个查找到的内容, 返回替换好的字符串

             有全局标识符 g 的时候, 会把字符串内所有满足正则规则的内容全部替换, 返回替换好的字符串

// 2. replace()     const str = 'abcd123abcd123abcd123abcd';     console.log(str.replace('123', '**'));     console.log(str.replace(/\d{3}/, '**'));     console.log(str.replace(/\d{3}/g, '**'));
复制代码

3. match()

        语法:

          1. 字符串.match(字符串片段)

          2. 字符串.match(正则表达式)

        返回值:

          1. 查找到字符串内一个满足字符串片段的内容返回, 返回格式和 exec 一模一样

          2. 当正则表达式没有全局标识符 g 的时候, 返回值和 exec 方法一模一样

             当正则表达式有全局标识符 g 的时候, 返回一个数组, 里面是所有满足条件的内容

// 3. match()    const str = 'hello 你好 world hello 世界 world hello 我不好 world hello 还行 world'    console.log(str.match('你好'))    console.log(str.match(/你好/))    console.log(str.match(/[\u4e00-\u9fa5]+/g))
复制代码

表单验证

        需求:

          随着用户输入, 随时进行表单验证

          文本框最右边有一个字体图标, 对勾或者叉子

          当用户输入的满足条件时, 显示对勾, 不满足条件时显示叉子

          假定用户名规则 非下划线开头, 只能由数字字母下划线组成, 6 ~ 12 位

          有一段文本提示, 当不满足要求的时候, 显示出文本内容

实现原理

        1. 获取 input 文本框绑定事件

          input 事件, 因为要随着输入随时验证

        2. 随时拿到用户输入的内容进行正则验证

//引入图标<link rel="stylesheet" href="//at.alicdn.com/t/font_2035193_jb4j6bvdrw.css">//CSS 部分* {      margin: 0;      padding: 0;    }
form { width: 500px; padding: 20px; border: 3px solid pink; border-radius: 15px; margin: 30px auto; }
form > label { position: relative; width: 100%; height: 30px; display: block; padding: 10px 0 20px; }
form > label > span { position: absolute; left: 10px; bottom: 5px; font-size: 12px; color: red; display: none; }
form > label > span.error { display: block; }
form > label > i { position: absolute; left: 250px; width: 20px; height: 20px; }
form > label > i.icon-cuowu { color: red; }
form > label > i.icon-zhengque { color: green; } //HTML 部分<form> <label> 用户名: <input type="text"> <!-- <i class="iconfont icon-cuowu"></i> --> <i class="iconfont"></i> <span>只能由数字字母下划线组成, 6 ~ 12 位, 不能以 _ 开头</span> </label> </form>
复制代码


 // 0. 准备正则    const reg = /^[0-9a-zA-Z]\w{5,11}$/    let timer = 0
const i = document.querySelector('i') const span = document.querySelector('span') // 1. 获取元素绑定事件 const inp = document.querySelector('input') inp.addEventListener('input', function () { clearTimeout(timer) timer = setTimeout(() => { // 2. 随时进行正则验证 if (reg.test(this.value)) { // 对勾显示 i.classList.add('icon-zhengque') i.classList.remove('icon-cuowu') span.classList.remove('error') } else { // 叉子 和 文本显示 i.classList.add('icon-cuowu') i.classList.remove('icon-zhengque') span.classList.add('error') } }, 300) })
复制代码


发布于: 刚刚阅读数: 3
用户头像

Jason199

关注

还未添加个人签名 2022.04.29 加入

一条努力上岸的咸鱼

评论

发布
暂无评论
正则表达式(二)_正则表达式_Jason199_InfoQ写作社区