#JavaScript(WebAPIs)【04完结篇】

1.1,正则表达式(Regular Expression)是用于匹配字符串中字符串的组合的模式。在JavaScript 中,正则表达式也是对象

1.2.语法

 const 变量名 = /表达式/

test()方法

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    const str = '我们在学习前端'
    // 1,定义规则
    const re = /前端/
    // 2,查找是否匹配
    re.test(str) // test()返回值是 true 和 false
    console.log(re.test(str)); //返回true
  </script>
</body>

</html>

exec()方法  返回的是数组

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    const str = '我们在学习前端'
    // 1,定义规则
    const re = /前端/
    // 2,查找是否匹配
    re.test(str) // test()返回值是 true 和 false
    console.log(re.test(str)); //返回true
    re.exec(str)
    console.log(re.exec(str));
  </script>
</body>

</html>

1.3,元字符


MDNicon-default.png?t=N7T8https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Regular_Expressions

测试工具icon-default.png?t=N7T8https://tool.oschina.net/regex/

  • 边界类(表示位置,开头和结尾, 必须以什么结尾,用什么开头)
  • 量词(表示重复次数)
  • 字符类(比如\d 表示0-9)

1.4,边界符

  • 正则表达式中边界符主要有两个

边界符说明
^表示匹配行首的文本以谁开始
$表示匹配行首的文本以谁结束

 ^和$在一块就是精确匹配

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    console.log(/^哈/.test('哈'));
    console.log(/^哈$/.test('哈哈啊'));
  </script>
</body>

</html>

 1.5,量词

  • 量词用来 设定某个模式出现的次数
量词说明
*重复零次或者更多次
+重复一次或者更多次
重复零次或一次
{n}重复n次
{n,}重复n次或更多次
{n,m}重复n到m次
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    console.log('---------------------------------');
    console.log(/^哈/.test('哈'));
    console.log(/^哈$/.test('哈哈啊'));
    console.log('---------------------------------');
    console.log(/^哈*$/.test('哈')); //true
    console.log(/^哈*$/.test(''))
    console.log(/^哈*$/.test('二哈啊啊啊哈'))
    console.log(/^哈*$/.test('哈哈哈哈'))
    console.log(/^哈*$/.test('哈哈很哈'))
    
    console.log('---------------------------------');
  </script>
</body>

</html>
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    console.log('---------------------------------');
    console.log(/^哈/.test('哈'));
    console.log(/^哈$/.test('哈哈啊'));
    console.log('---------------------------------');
    console.log(/^哈+$/.test('哈')); //true
    console.log(/^哈+$/.test(''))
    console.log(/^哈+$/.test('二哈啊啊啊哈'))
    console.log(/^哈+$/.test('哈哈哈哈'))
    console.log(/^哈+$/.test('哈哈很哈'))
    
    console.log('---------------------------------');
  </script>
</body>

</html>
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    console.log('---------------------------------');
    console.log(/^哈/.test('哈'));
    console.log(/^哈$/.test('哈哈啊'));
    console.log('---------------------------------');
    console.log(/^哈?$/.test('哈')); //true
    console.log(/^哈?$/.test(''))
    console.log(/^哈?$/.test('二哈啊啊啊哈'))
    console.log(/^哈?$/.test('哈哈哈哈'))
    console.log(/^哈?$/.test('哈哈很哈'))

    console.log('---------------------------------');
  </script>
</body>

</html>

                                注意逗号左右不要出现空格

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    console.log('---------------------------------');
    console.log(/^哈/.test('哈'));
    console.log(/^哈$/.test('哈哈啊'));
    console.log('---------------------------------');
    console.log(/^哈?$/.test('哈')); //true
    console.log(/^哈?$/.test(''))
    console.log(/^哈?$/.test('二哈啊啊啊哈'))
    console.log(/^哈?$/.test('哈哈哈哈'))
    console.log(/^哈?$/.test('哈哈很哈'))

    console.log('---------------------------------');

    console.log(/^哈{4}$/.test('哈哈哈哈'));
    console.log(/^哈{4}$/.test('哈哈'));
    console.log(/^哈{4}$/.test('哈哈哈哈哈'));
    console.log('---------------------------------');
    console.log('---------------------------------');
    console.log(/^哈{4,}$/.test('哈哈哈哈'));
    console.log(/^哈{4,}$/.test('哈哈'));
    console.log(/^哈{4,}$/.test('哈哈哈哈哈'));
    console.log('---------------------------------');
    console.log(/^哈{4,6}$/.test('哈哈哈哈'));
    console.log(/^哈{4,6}$/.test('哈哈'));
    console.log(/^哈{4,6}$/.test('哈哈哈哈哈'));
  </script>
</body>

</html>

1.6,字符类

  • [ ]  匹配字符合集
  • 后面字符串只要包含abc任意一个字符,都返回true
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    //字符类   [abc] 只选一个
    console.log(/^[abc]$/.test('a'));
    console.log(/^[abc]$/.test('b'));
    console.log(/^[abc]$/.test('c'));
    console.log(/^[abc]$/.test('ac'));
    console.log(/^[abc]{2}$/.test('ba'));
    console.log(/^[abc]$/.test('bc'));
    console.log(/^[abc]{3}$/.test('abc'));
  </script>
  </script>
</body>

</html>
  • 字符类  [a-z]   26个字母都包含了
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    //字符类   [abc] 只选一个
    console.log(/^[abc]$/.test('a'));
    console.log(/^[abc]$/.test('b'));
    console.log(/^[abc]$/.test('c'));
    console.log(/^[abc]$/.test('ac'));
    console.log(/^[abc]{2}$/.test('ba'));
    console.log(/^[abc]$/.test('bc'));
    console.log(/^[abc]{3}$/.test('abc'));
    console.log('---------------------------------');
    console.log(/^[a-z]$/.test('abc'));
    console.log(/^[A-Z]$/.test('abcQ'));
    console.log('---------------------------------');
    console.log(/^[0-9]$/.test('a'));
    console.log(/^[a-zA-Z0-9]$/.test('k'));

  </script>
  </script>
</body>

</html>
  • [^a-z]  除了小写字母
  • . 匹配换行符以外的任何单个字符

1.7,案例

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    .error {
      color: red;
    }

    .right {
      color: green;
    }
  </style>

</head>

<body>
  <input type="text">
  <span></span>
  <script>
    const re = /^[a-zA-Z0-9-_]{6,16}$/
    const input = document.querySelector('input')
    const span = input.nextElementSibling
    input.addEventListener('blur', function () {
      if (re.test(this.value)) {
        span.innerHTML = '输入正确'
        span.className = 'right'
      }
      else {
        span.innerHTML = '输入错误'
        span.className = 'error'
      }
    })
  </script>
</body>

</html>

预定义类

预定类说明
\d匹配0-9之间的任一数字,相当于[0-9]
\D匹配所有0-9以外的字符,相当于[^0-9]
\w匹配任意的字母,数字下划线,相当于[A-Za-z0-9_]
\W除所有字母,数字下划线以外的字符,相当于[^A-Za-z0-9_]
\s匹配空格(包括换行换行符,制表符,空格等),相当于[\t\r\n\v\f]
\S匹配非空格的字符,相当于[^\t\r\n\v\f]
  <script>
    日期格式:^\d{ 4 } -\d{ 1, 2 } -\d{ 1, 2 } \ 
  </script>

1.8 ,修饰符

replace 方法:

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    const str = 'java是一门编程语言,java很牛'
    const re = str.replace(/java/i, '前端')
    const re2 = str.replace(/java/ig, '前端')
    const re3 = str.replace(/java|JAVA/ig, '前端')
    console.log(re);
    console.log(re2);
  </script>
</body>

</html>

1.9,过滤敏感词

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <textarea name="" id="" cols="30" rows="10"></textarea>
  <button>发布</button>
  <div></div>
  <script>
    const tx = document.querySelector('textarea')
    const btn = document.querySelector('button')
    const div = document.querySelector('div')
    btn.addEventListener('click', function () {

      div.innerHTML = tx.value.replace(/激情|基情/, '**')
      tx.value = ''
    })
  </script>
</body>

</html>

综合案例表单案例

01验证码倒计时模块:

    (function (){
      //发送短信验证码模块
      const code = document.querySelector('.code')
      let flag = true  //通过一个变量来控制
      //点击时间
      code.addEventListener('click',function (){
        if(flag){
          //取反了 下一次不能马上第二次点击点击
          flag = false
          let i = 6
          //点击完毕立马触发
          code.innerHTML = `0${i}秒后重新获取`
          //倒计时模块
          let timeId = setInterval(function (){
            i--
            code.innerHTML = `0${i}秒后重新获取`
            if(i===0){
              //倒计时结束 变回原样
              clearInterval(timeId)
              // 重新获取
              code.innerHTML = `重新获取`
              //时间到了 开启flag
              flag = true
            }
          },1000)
        }
      })

    }())

02验证表单

    //验证名称
    //获取表单
    const username = document.querySelector('[name=username]')
    //使用change事件
    username.addEventListener('change',verifyName)
    //封装函数
    function verifyName(){
    // 定规则 正则表达式
      const span = username.nextElementSibling
      const re = /^[a-zA-Z0-9]{6,10}$/
      if(!re.test(username.value)){
        // console.log(11)
        span.innerText = '输入不合法,请输入6~10位'
        return false
      }
      //合法的 就清空span
      span.innerText = ''
      return true
    }

03验证手机号是否合法

    //验证手机号
    //获取表单
    const phone = document.querySelector('[name=phone]')
    //使用change事件
    phone.addEventListener('change',verifyPhone)
    //封装函数
    function verifyPhone(){
      // 定规则 正则表达式
      const span = phone.nextElementSibling
      const re = /^1(\d|4[5-9]|5[0-35-9]|6[567]|7[0-8]8\d[0-35-9])\d{8}$/
      if(!re.test(phone.value)){
        // console.log(11)
        span.innerText = '输入不合法,请输入11位'
        return false
      }
      //合法的 就清空span
      span.innerText = ''
      return true
    }

04验证 验证码输入是否合法

    //验证验证码
    //获取表单
    const codeInput = document.querySelector('[name=code]')
    //使用change事件
    codeInput.addEventListener('change',verifyCode)
    //封装函数
    function verifyCode(){
      // 定规则 正则表达式
      const span = codeInput.nextElementSibling
      const re = /^\d{6}$/
      if(!re.test(codeInput.value)){
        // console.log(11)
        span.innerText = '输入不合法,请输入6位验证码'
        return false
      }
      //合法的 就清空span
      span.innerText = ''
      return true
    }

05验证密码是否合法

   //验证密码框
    //获取表单
    const password = document.querySelector('[name=password]')
    //使用change事件
    password.addEventListener('change',verifyPwd)
    //封装函数
    function verifyPwd(){
      // 定规则 正则表达式
      const span = password.nextElementSibling
      const re = /^[a-zA-Z0-9-_](6,20)$/
      if(!re.test(password.value)){
        // console.log(11)
        span.innerText = '输入不合法,请输入合法密码'
        return false
      }
      //合法的 就清空span
      span.innerText = ''
      return true
    }

06验证第二次输入的密码是否与第一次相同


    //密码的再次验证
    //获取表单
    const confirm = document.querySelector('[name=confirm]')
    //使用change事件
    confirm.addEventListener('change',verifyPwdconfirm)
    //封装函数
    function verifyPwdconfirm (){
      // 定规则 正则表达式
      const span = confirm.nextElementSibling
      // const re = /^[a-zA-Z0-9-_](6,20)$/
      // 判断两次密码是否相等
      if(confirm.value !== password.value){
        // console.log(11)
        span.innerText = '两次输入密码不一致'
        return false
      }
      //合法的 就清空span
      span.innerText = ''
      return true
    }

07我同意模块


    //提交模块
    const form = document.querySelector('form')
    form.addEventListener('submit',function(e){
      //判断是否勾选我同意,如果有icon-queren2说明勾选了,否则就没勾选
      if(!queren.classList.contains('icon-queren2')){
         alert('请勾选协议')
         e.preventDefault()
      }
      //依次判断
      if(!verifyName()) e.preventDefault()
      if(!verifyPhone()) e.preventDefault()
      if(!verifyCode()) e.preventDefault()
      if(!verifyPwd()) e.preventDefault()
      if(!verifyPwdconfirm()) e.preventDefault()
    })

总结相关正则表达式

综合案例放大镜案例

01获取三个盒子

  // 1. 获取三个盒子
    // 2. 小盒子 图片切换效果
    const small = document.querySelector('.small')
    //  中盒子
    const middle = document.querySelector('.middle')
    //  大盒子
    const large = document.querySelector('.large')
    // 2. 事件委托
    small.addEventListener('mouseover', function (e) {
      if (e.target.tagName === 'IMG') {
        // console.log(111)
        // 排他 干掉以前的 active  li 上面
        this.querySelector('.active').classList.remove('active')
        // 当前元素的爸爸添加 active
        e.target.parentNode.classList.add('active')
        // 拿到当前小图片的 src
        // console.log(e.target.src)
        // 让中等盒子里面的图片,src 更换为   小图片src
        middle.querySelector('img').src = e.target.src
        // 大盒子更换背景图片
        large.style.backgroundImage = `url(${e.target.src})`
      }
    }) 

02鼠标经过中等盒子, 显示隐藏 大盒子

   // 3. 鼠标经过中等盒子, 显示隐藏 大盒子
    middle.addEventListener('mouseenter', show)
    middle.addEventListener('mouseleave', hide)
    let timeId = null
    // 显示函数 显示大盒子
    function show() {
      // 先清除定时器
      clearTimeout(timeId)
      large.style.display = 'block'
    }
    // 隐藏函数 隐藏大盒子
    function hide() {
      timeId = setTimeout(function () {
        large.style.display = 'none'
      }, 200)
    }

03鼠标经过大盒子, 显示隐藏 大盒子

    // 4. 鼠标经过大盒子, 显示隐藏 大盒子
    large.addEventListener('mouseenter', show)
    large.addEventListener('mouseleave', hide)

04鼠标经过中等盒子,显示隐藏 黑色遮罩层

    // 5. 鼠标经过中等盒子,显示隐藏 黑色遮罩层
    const layer = document.querySelector('.layer')
    middle.addEventListener('mouseenter', function () {
      layer.style.display = 'block'
    })
    middle.addEventListener('mouseleave', function () {
      layer.style.display = 'none'
    })

05移动黑色遮罩盒子(*******)

  // 6.移动黑色遮罩盒子
    middle.addEventListener('mousemove', function (e) {
      // let x = 10, y = 20
      // console.log(11)
      // 鼠标在middle 盒子里面的坐标 = 鼠标在页面中的坐标 - middle 中等盒子的坐标
      // console.log(e.pageX)鼠标在页面中的坐标
      // middle 中等盒子的坐标
      // console.log(middle.getBoundingClientRect().left)
      let x = e.pageX - middle.getBoundingClientRect().left
      let y = e.pageY - middle.getBoundingClientRect().top - document.documentElement.scrollTop
      // console.log(x, y)
      // 黑色遮罩移动 在 middle 盒子内 限定移动的距离
      if (x >= 0 && x <= 400 && y >= 0 && y <= 400) {
        // 黑色盒子不是一直移动的
        // 声明2个变量 黑色盒子移动的 mx my变量 
        let mx = 0, my = 0
        if (x < 100) mx = 0
        if (x >= 100 && x <= 300) mx = x - 100
        if (x > 300) mx = 200

        if (y < 100) my = 0
        if (y >= 100 && y <= 300) my = y - 100
        if (y > 300) my = 200

        layer.style.left = mx + 'px'
        layer.style.top = my + 'px'
        // 大盒子的背景图片要跟随 中等盒子移动  存在的关系是 2倍   
        large.style.backgroundPositionX = -2 * mx + 'px'
        large.style.backgroundPositionY = -2 * my + 'px'
      }
    })

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值