• 正则表达式详解


    正则是啥?

    正则表达式的语法一般如下(js),两条斜线中间是正则主体,这部分可以有很多字符组成;i部分是修饰符,i的意思表示忽略大小写

    /^abc/i
    

      正则定义了很多特殊意义的字符,有名词,量词,谓词等,下面逐一介绍

    简单字符

    没有特殊意义的字符都是简单字符,简单字符就代表自身,绝大部分字符都是简单字符,举个例子

    /abc/ // 匹配 abc
    /123/ // 匹配 123
    /-_-/ // 匹配 -_-
    /下个村/ // 匹配 下个村
    

      

    转义字符

    是转移字符,其后面的字符会代表不同的意思,转移字符主要有三个作用:

    第一种,是为了匹配不方便显示的特殊字符,比如换行,tab符号等

    第二种,正则中预先定义了一些代表特殊意义的字符,比如w等

    第三种,在正则中某些字符有特殊含义(比如下面说到的),转义字符可以让其显示自身的含义

    下面是常用转义字符列表:

    字符集和

    有时我们需要匹配一类字符,字符集可以实现这个功能,字符集的语法用[]分隔,下面的代码能够匹配a或b或c

    [abc]
    

      如果要表示字符很多,可以使用-表示一个范围内的字符,下面两个功能相同

    [0123456789]
    [0-9]
    

      当然英文也同样适用

    [a-z]//这是小写的
    [A-Z]//这是大写的

    字符边界

    有时我们会有边界的匹配要求,比如已xxx开头,已xxx结尾

    ^在[]外表示匹配开头的意思

    ^abc // 可以匹配abc,但是不能匹配aabc
    

      $在[]外表示结束匹配的意思

    abc$//可以是abc到c结束,没有其他的
    

      两个符号一般配合使用表示一个区间

    分组与引用

    分组是正则中非常强大的一个功能,可以让上面提到的量词作用于一组字符,而非单个字符,分组的语法是圆括号包裹(xxx)

    (abc){2} // 匹配abcabc
    

      分组不能放在[]中,分组中还可以使用选择表达式

    (123|456){2} // 匹配 123123、456456、123456、456123
    

      

    修饰符

    默认正则是区分大小写,这可能并不是我们想要的,正则提供了修饰符的功能,修复的语法如下

    /xxx/gi // 最后面的g和i就是两个修饰符
    

      g正则遇到第一个匹配的字符就会结束,加上全局修复符,可以让其匹配到结束

    i正则默认是区分大小写的,i可以忽略大小写

    m正则默认遇到换行符就结束了,不能匹配多行文本,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>
        <form action="http://www.163.com" method="GET">
            <input type="text"><span></span><br>
            <input type="text"><span></span><br>
            <input type="text"><span></span><br>
            <input type="submit">
        </form>
        <script>
            // 找到窗口元素from表单赋值给变量
            var form = document.querySelector("form");
            // 把所有的input转换为数组给list
            var list = Array.from(document.getElementsByTagName("input"));
            // 删除最后一个不需要判定的submit标签
            list.pop();
            // 新建一个空数组
            var arr = [];
            // 遍历这个数组添加到上面的空数组arr且为每一个元素添加false
            for (var i = 0; i < list.length; i++) {
                arr.push(false);
            }
            // 给表单添加submit的事件侦听 以及事件的处理函数fromHandler
            form.addEventListener("submit", fromHandler);
            // 给表单添加input(表单文本输入)事件侦听  以及事件处理函数
            form.addEventListener("input", fromHandler);
        //    侦听事件处理函数
            function fromHandler(e) {
                // 如果事件侦听到的对象是input时执行
                if (e.type === "input") {
                    // 变量index等于list列表查询到的事件侦听对象
                    var index = list.indexOf(e.target);
                    // 变量bool等于getVerify下标,事件侦听到的value值
                    var bool = getVerify(index, e.target.value);
                    // 如果bool值是true执行
                    if (bool) {
                        // 事件实际点击到的相邻的下一个元素的文本区显示字符串为“正确”,字体颜色改为绿色
                        e.target.nextElementSibling.textContent = "正确";
                        e.target.nextElementSibling.style.color = "green";
                    } else {
                        // 反之  文本显示错误  颜色红色
                        e.target.nextElementSibling.textContent = "错误";
                        e.target.nextElementSibling.style.color = "red";
                    }
                    // 数组arr中的下标index对应的每一个元素等于bool
                    arr[index] = bool;
                    // 反之  如果事件的类型是submit提交  且数组中没有false
                }else if(e.type==="submit"&&arr.indexOf(false)===-1){
                 
    
                }else{
                    // 反之  取消事件默认属性
                    e.preventDefault();
                    打印文本
                    console.log("输入正确后提交")
                }
            }
            // input事件验证   下标  值
            function getVerify(index,value){
              switch(index){
                //   当下标等于0   第一项
                    case 0:
                    // 验证正则返回bool值
                        return /^w{8,16}$/.test(value);
                        // 第二项
                    case 1:
                        return /^(?=D+d)(?=.*[a-z])(?=.*[A-Z])[a-zA-Z0-9]{8,16}$/.test(value);
                        // 第三项
                    case 2:
                        return /^1d{10}$/.test(value);
              }
            }
        </script>
    </body>
    
    </html>
    

      结语  结合案例的应用和演练不难发现正则的应用场景和实际作用

  • 相关阅读:
    《Asp.Net Forums2.0深入分析》之 Asp.Net Forums是如何实现代码分离和换皮肤的
    Community Server专题五:IHttpHandlerFactory
    自定义 HttpModule 示例
    动态加入控件的方法
    JS应用DOM入门:DOM的对象属性
    JS应用DOM入门:简单文档DOM结构分析
    httpmodule专题(2)
    Java 算法之快速排序
    HTML与.jsp的融合
    Exception
  • 原文地址:https://www.cnblogs.com/zqm0924/p/12682097.html
Copyright © 2020-2023  润新知