• JavaScript课程——Day09(数组的迭代方式、正则)


    1、数组的迭代方式

    迭代:循环、遍历

    IE8及以下不支持

      1.1、forEach

      作用:没有返回值,代表for循环数组

    // 数组.forEach(function (数组项, 数组下标, 数组本身) { });
    // 作用:没有返回值,代表for循环数组
    var arr = ['刘备', '关羽', '张飞'];
    arr.forEach(function (item, index, array) {
        console.log(item, index, array);
    });

      1.2、map

      作用:循环数组,返回每一项函数调用的结果组成的一个新数组

    // 数组.map(function (数组项, 数组下标, 数组本身) { });
    // 作用:循环数组,返回  每一项函数调用的结果组成的一个新数组
    var arr = [1, 43, 2, 6];
    var n = arr.map(function (item, index, array) {
        return item * 2;
    });
    console.log(n); // [2, 86, 4, 12]

      1.3、filter

      作用:循环数组,如果当前函数调用的结果为真,则将这一项的item放在一个数组中返回

    // 数组.filter(function (数组项, 数组下标, 数组本身) { });
    // 作用:循环数组,返回  如果当前函数调用的结果为真,则将这一项的item放在一个数组中返回
    var arr = [1, 43, 2, 6, 12];
    var n = arr.filter(function (item) {
        return item > 5 && item < 20;
    });
    console.log(n); // [6, 12]
    
    var arr = [
        { name: '李文涛', num: 86 },
        { name: '张新昊', num: 76 },
        { name: '黄锦标', num: 99 },
        { name: '刘传超', num: 34 },
        { name: '孙传恒', num: 56 },
        { name: '杜旭超', num: 78 }
    ];
    var n = arr.filter(function (item) {
        return item.num >= 60 && item.num < 80
    })
    console.log(n);

      1.4、every

      作用:循环数组,如果每一项都返回真,结果返回真

    // 数组.every(function (数组项, 数组下标, 数组本身) { });
    // 作用:循环数组,如果每一项都返回真,结果返回真
    var arr = [1, 43, 2, 6, 12];
    var n = arr.every(function (item) {
        return item > 0;
    });
    console.log(n);

      1.5、some

      作用:循环数组,只要有一项返回真,结果返回真

    // 数组.some(function (数组项, 数组下标, 数组本身) { });
    // 作用:循环数组,只要有一项返回真,结果返回真
    var arr = [1, 43, 2, 6, 12];
    var n = arr.some(function (item) {
        return item > 20;
    });
    console.log(n);

    2、正则

    实现定义好的一些特殊字符,及这些特定字符的组合,组成一个规则字符串,这个字符串就是正则。

    正则是操作字符串

    RegExp:正则(regular)   表达式(expression)

      2.1、写法

    • 字面量创建:/检索字符/修饰符;
    • 构造函数创建:new RegExp('检索字符','修饰符');

      构造函数创建的优点:如果有变量,就只能用构造函数方式创建

    // 1、字面量
    // /检索字符/修饰符;
    var re1 = /a/;
    console.log(re1);
    console.log(typeof re1); // 'object'
    
    
    // 2、构造函数(如果有变量,就只能用构造函数方式创建)
    // new RegExp('检索字符', '修饰符');
    var re2 = new RegExp('a');
    console.log(re2);
    
    // ---------------------------
    var a = 'abc';
    var re3 = new RegExp(a);
    console.log(re3);

      2.2、修饰符

    // 全局匹配
    // 正则默认只匹配成功一次,就不再匹配
    // 如果要全部匹配,则加修饰符g
    var str = '今天上课,明天上课,后天上课';
    
    var re1 = /上课/;
    // var re2 = /上课/g;
    var re2 = new RegExp('上课', 'g');
    console.log(str.replace(re1, '休息'));
    console.log(str.replace(re2, '休息'));
    
    // ---------------------------------------
    // 不区分大小写
    // 正则默认区分大小写
    // 如果要不区分大小写,加修饰符i
    var str = 'abCd';
    var re1 = /abcd/;
    var re2 = /abcd/i;
    console.log(re1.test(str)); // false
    console.log(re2.test(str)); // true

      2.3、正则的方法

        2.3.1、test

        作用:检索字符串中是否包含正则要检索的内容,有则返回true,没有则返回false

    // 正则.test(字符串)
    // 作用:检索字符串中是否包含正则要检索的内容,有则返回 true,没有则返回 false。
    
    var str = 'hello world';
    var re = /o/;
    console.log(re.test(str)); // true

        2.3.2、exec

        作用:检索到正则表达式规定的内容会返回一个数组,检索不到则返回null

    // 正则.exec(字符串);
    // 作用:检索到正则表达式规定的内容会返回一个数组,检索不到则返回 null
    // 同match
    
    var str = 'hello world';
    var re = /o/;
    var re2 = /z/;
    
    console.log(re.exec(str)); // ['o', ...]
    console.log(re2.exec(str)); // null

        2.3.3、match

        作用:正则去匹配字符串,如果匹配成功,就返回匹配成功的数组,如果匹配不成功,就返回null,跟exec方法一样

    // 字符串.match(正则);
    // 正则去匹配字符串,如果匹配成功,就返回匹配成功的数组,如果匹配不成功,就返回null,跟exec方法一样
    
    var str = 'haj123sdk54hask33dkhalsd879';
    var re = /d+/g;
    console.log(str.match(re));

        2.3.4、split

        作用:按正则匹配的内容拆分成数组

    // 字符串.split(正则);
    // 作用:按正则匹配的内容拆分成数组
    
    // var str = 'hello web';
    // var re = /s/;
    // console.log(str.split(re)); // [hello, web]
    
    // -----------------------
    var str = '2022-11-12 12:13:10'; // [2022,11,12,12,13,10]
    var re = /s|-|:/; // 以空格  或者以-  或者以:
    console.log(str.split(re));

        2.3.5、replace

        作用:替换正则匹配的字符串,返回的结果是替换以后的字符串,不影响原字符串

        replace的第二个参数可以使一个字符串,也可以是一个函数,函数的第一个参数就是正则匹配成功的整体,第二个参数就是正则的第一个小括号,以此类推

    // 字符串.replace(正则, 新的字符串)
    // 作用:替换正则匹配的字符串,返回的结果是替换以后的字符串,不影响原字符串
    // replace的第二个参数可以是一个字符串,也可以是一个函数,函数的第一个参数就是正则匹配成功的整体,第二个参数就是正则的第一个小括号,以此类推
    
    var str = '今天上课,明天上课,后天上课';
    var re = /上课/g;
    console.log(str.replace(re, '休息'));
    
    // ---------------------------------------------------------------
    // 手机号中间四位变星
    var str = '13344445555'; // 133****9999
    var re = /(d{3})(d{4})(d{4})/; // 小括号是分组
    
    // 方式一
    var s = str.replace(re, '$1****$3');
    console.log(s); // 133****5555
    
    // 方式二
    var s = str.replace(re, function ($0, $1, $2, $3) {
        // console.log($0, $1, $2, $3);
        return $1 + '****' + $3;
    })
    console.log(s); // 133****5555

        2.3.6、search

        作用:返回正则匹配到的第一个字符串的位置,没有返回-1,类似于indexOf

    // 字符串.search(正则);
    // 返回正则匹配到的第一个字符串的位置,没有返回-1,类似于indexOf
    
    var str = 'hello world';
    
    var re = /o/;
    console.log(str.search(re)); // 4
    console.log(str.search(/z/)); // -1

      2.4、其他

        2.4.1、转义字符

    d    匹配数字
    D    匹配非数字
    w    匹配字母和数字及_
    W    匹配非字母和数字及_
    s    匹配空白字符、空格、制表符和换行符
    S    匹配非空白字符

        2.4.2、量词

    {4,7}  : 最少出现4次,最多出现7次
    {4,} : 最少出现4次,最多不限制
    {4} : 正好出现4次
    {1,} : 最少出现一次。简写为:+
    {0,}  : 至少出现0次。简写为:*
    {0,1}  : 出现0次或者1次。简写为:?
    +和*的区别:+代表必须有,*代表可以没有。

        2.4.3、或者:|

    var re = /s|-|:/; // 以空格  或者以-  或者以:

        2.4.4、分组(小括号)

    var re = /(d{3})(d{4})(d{4})/; // 小括号是分组

        2.4.5、点.

    // .   除换行以外的任意字符
    var str = 'hello web';
    var re = /h.*o/; // 0个或多个任意字符
    console.log(re.test(str));
    
    // 真正的点用 : .    
    var str1 = 'abc.html';
    var str2 = 'abcdhtml';
    var re = /.html/;
    console.log(re.test(str1));
    console.log(re.test(str2));

        2.4.6、正则中的中括号及排除

        字符类:即一对中括号代表一个字符

    // 中括号:字符类
    var str = 'adc';
    var re = /a[abcd]c/; // [abcd]即a b c d中的任何一个字符即可
    console.log(re.test(str));
    
    var re = /[a-zA-Z0-9]/; // 大小写字母及数字
    var re = /[a-d]/; // a-d
    
    // -------------------------

    // 中括号中的取反 var str = 'azc'; var re = /a[^abcd]c/; // 排除a b c d,其它任何字符均可 console.log(re.test(str));

        2.4.7、起始和结束

    <input type="text">
    <button>判断</button>
    
    <script>
        // 起始和结束
        // ^  行首匹配
        // $  行尾匹配
    
        var input = document.querySelector('input');
        var btn = document.querySelector('button');
    
        btn.onclick = function () {
            var v = input.value; // 字符串
    
            // // 判断手机号
            var re = /^1d{10}$/;
            if (re.test(v)) {
                alert('是手机号')
            } else {
                alert('错误');
            }
    
            // 判断qq号
            var re = /^[1-9]d{5,11}$/;
            if (re.test(v)) {
                alert('是QQ号')
            } else {
                alert('错误');
            }
    
        }
    </script>

        2.4.8、去除字符串左右的空格

    var str = '    吃饭,睡觉,打豆豆   ';
    
    console.log('(' + str + ')');
    console.log('(' + str.trim() + ')'); // IE8及以下不支持
    
    // ----------------------------------
    // 原理
    var re = /^s+|s+$/g;
    var s = str.replace(re, '');
    console.log('(' + s + ')');
    
    // -----------------------
    // 封装函数
    function trim(str) {
        var re = /^s+|s+$/g;
        return str.replace(re, '');
    }
    console.log('(' + trim(str) + ')');

        2.4.9、正则相关实例

    // 中文
    var str = '小朋ewfsa友dsfdsf你dsf是fdssfd否dsafds有fds很fdsfdf多fds问号';
    var re = /[u4e00-u9fa5]/g;
    console.log(str.match(re).join(''));
    
    // 邮箱
    var str = '2342423@qq.com';
    var str = 'feew_fds@163.com';
    var re = /^w+@[a-z0-9]+(.[a-z]+){1,3}$/;
    
    // 网址
    var str = 'https://www.baidu.com';
    var re = /^[a-zA-Z]+://[^s]+$/;
    
    // 身份证
    var re = /^[1-9]d{14}|[1-9]d{17}|[1-9]d{16}x$/;
    
    // 座机
    var re = /^0d{2,3}-[1-9]d{6,7}$/;

      2.5、前瞻后顾

    • 前瞻:exp1(?=exp2)          查找 exp2 前面的 exp1
    • 负前瞻:exp1(?!exp2)       查找后面不是 exp2 的 exp1
    • 后顾:(?<=exp2)exp1        查找 exp2 后面的 exp1
    • 负后顾:(?<!exp2)exp1      查找前面不是 exp2 的 exp1
    var str = '我就是我,来优就业学习,高薪就业,高效就业';
    
    // 前瞻    : exp1(?=exp2)    查找 exp2 前面的 exp1
    var re = /就(?=业)/g;     // 就业中的就
    var s = str.replace(re, 'jiu');
    console.log(s); // 我就是我,来优jiu业学习,高薪jiu业,高效jiu业
    
    // 负前瞻   :  exp1(?!exp2)     查找后面不是 exp2 的 exp1
    var re = /就(?!业)/;    // 不是就业中的就
    var s = str.replace(re, 'jiu');
    console.log(s); // 我jiu是我,来优就业学习,高薪就业,高效就业
    var path1 = 'path/hello.html';
    var path2 = 'path/nodata.html';
    var path3 = 'path/index.html';
    
    // 前瞻     : exp1(?=exp2)    查找 exp2 前面的 exp1
    var re = /[a-z]+(?=.html)/;
    console.log(path1.match(re)[0]);
    console.log(path2.match(re)[0]);
    console.log(path3.match(re)[0]);
    
    // 后顾     : (?<=exp2)exp1     查找 exp2 后面的 exp1
    var re = /(?<=path/)[a-z]+/;
    console.log(path1.match(re)[0]);
    console.log(path2.match(re)[0]);
    console.log(path3.match(re)[0]);
    var str = 'a,1,b,2,c,3'; // a=1,b=2,c=3
    
    // 后顾     : (?<=exp2)exp1     查找 exp2 后面的 exp1
    var re = /(?<=[a-z]),/g;
    var s = str.replace(re, '=');
    console.log(s);
    
    // 负后顾     : (?<!exp2)exp1   查找前面不是 exp2 的 exp1
    var re = /(?<!d),/g;
    var s = str.replace(re, '=');
    console.log(s);
  • 相关阅读:
    C#中静态变量 静态类 静态成员
    C#类型转换
    ASP.NET页面跳转及传值方式
    ADO.NET
    C#方法的参数类型
    Oracle %TYPE 和 %ROWTYPE
    静态页面与动态页面
    相对路径和绝对路径
    45 个非常有用的 Oracle 查询语句(转)
    ASP.NET MVC 之表格分页
  • 原文地址:https://www.cnblogs.com/miaochaofan/p/14715517.html
Copyright © 2020-2023  润新知