js-day09 迭代方法 正则

迭代方法

迭代: every some filter map forEach

every

every: 对数组的每一个项做一些判断, 根据函数的返回值, 如果每个项执行函数的返回值都是true, 返回true. 如果有一个是false 返回false

全真为真 一假为假

语法: 数组.every(函数);

函数有3个形参: 项 下标 原数组

var arr = ['a', 'b', 'c', 'd'];
var res = arr.every(function (v, i, a) {
    console.log(i, v, a);
    // return true;
    return 0;
});
console.log(res);

some

some: 对数组的每一个项做一些判断, 根据函数的返回值, 如果每个项执行函数的返回值都是false, 返回false. 如果有一个是true 返回true

全假为假 一真为真

语法: 数组.some(函数);

函数有3个形参: 项 下标 原数组

var res1 = arr.some(function (v, i, a) {
    console.log(i, v, a);
    // return true;
    return undefined;
});
console.log(res1);

filter

filter: 对数组中的做一些过滤, 会将符合条件的(函数的返回值是true)项组成一个新数组返回;

语法: 数组.filter(函数);

函数有3个形参: 项 下标 原数组

常使用: 数据筛选过滤

var arr = ['a', 'b', 'c', 'd'];
var res2 = arr.filter(function (v, i, a) {
    console.log(i, v, a);
    return i > 1;
});
console.log(res2);

map

map\forEach: for循环

map: for循环 将每个函数的返回值组成新数组返回 造成内存浪费

forEach: 纯粹的for循环 没有返回值

数组.map/forEach(函数);

var res3 = arr.map(function (v, i, a) {
    // console.log(i, v, a);
    return v + '1';
});
console.log(res3);

forEach

map\forEach: for循环

map: for循环 将每个函数的返回值组成新数组返回 造成内存浪费

forEach: 纯粹的for循环 没有返回值

数组.map/forEach(函数);

var res4 = arr.forEach(function (v, i, a) {
    console.log(i, v, a);
    return v + '1';
});
console.log(res4);

正则

正则: 用规定好的具有特定含义的字符组成的规则字符串, 用来实现字符串的检索和替换.

创建正则

new关键字创建:

语法: var 变量 = new RegExp(规则字符串, 修饰符);

var reg = new RegExp('web', 'ig');
console.log(reg); // /web/gi
console.log(typeof reg); // object

字面量声明

语法: var 变量 = /规则字符串/修饰符;

var reg1 = /web/ig;
console.log(reg1); // /web/gi

修饰符

没有顺序

i: ignore case 忽略大小写

g: global 全局

检索方法

replace

字符串.replace(要替换的字符/正则, 新字符/函数);

函数的返回值就是替换的新字符

函数有一个形参: 每次匹配到的结果

var str = 'web01web02web03Web04WEB05';
console.log(str);
​
// web-->***
var reg = /web/gi;
console.log(str.replace(reg, '***'));
console.log(str.replace(reg, function (a) {
    console.log(a);
    return 'aaa';
}));

split

字符串.split(分割符/正则);

var str = 'web0web1web2web0web1';
console.log(str.split('0'));
var reg = /\d/; // 数字\d
console.log(str.split(reg));

search

search: 替换indexOf 使用正则做查找 返回找到的符合正则的第一个位置上的下标

惰性查找

var str = 'web0web1web2web0web1';
var reg = /\d/;
console.log(str.search(reg));

match

字符串.match(正则);

返回一个数组

单个匹配结果: ['web', index: 0, input: 'web0web1web2web0web1', groups: undefined]

多个匹配结果: ['0', '1', '2', '0', '1']

var str = 'web0web1web2web0web1';
var reg = /\d/;
var reg = /\d/ig;
console.log(str.match(reg));

exec

exec: 正则.exec(字符串);

返回值与match的单个返回结果一致

如果有返回数组 如果没有 返回null

惰性查找, 一次只找一个, 如果加了g 会从上一次找到的位置开始找 不加g 每次都从下标0开始找

正则.lastIndex: 返回下一次正则匹配开始的位置

var str = 'webstrweb0123';
var reg = /web/;
console.log(reg.exec(str));

var reg = /web/g;
console.log(reg.lastIndex); // 0
console.log(reg.exec(str));
console.log(reg.lastIndex); // 3
console.log(reg.exec(str));
console.log(reg.lastIndex); // 9
console.log(reg.exec(str)); // null
console.log(reg.lastIndex); // 0
console.log(reg.exec(str));

test

test: 正则.test(字符串);

判断字符串是否有符合正则的字符 如果有 返回true 如果没有 返回false

惰性查找, 一次只找一个, 如果加了g 会从上一次找到的位置开始找 不加g 每次都从下标0开始找

var reg = /web/;
var str = 'web0web1web2';
console.log(reg.lastIndex); // 0
console.log(reg.test(str));
console.log(reg.lastIndex); // 0
console.log(reg.test(str));

var reg = /web/g;
console.log(reg.lastIndex); // 0
console.log(reg.test(str));
console.log(reg.lastIndex); // 3
console.log(reg.test(str));
console.log(reg.lastIndex); // 7
console.log(reg.test(str));
console.log(reg.lastIndex); // 11
console.log(reg.test(str)); // false
console.log(reg.lastIndex); // 0
console.log(reg.test(str));

元字符

一个元字符可以表示一类字符

一个元字符做匹配只能匹配一个字符

.

// 1. . 点: 除换行以外的任意字符
var str = '\n这是一个换行句子\n';
console.log(str);
var reg = /./;
console.log(reg.exec(str));

[] [^]

// 3. []: 字符集 匹配[]里的任意一个字符 [^]: 非字符集 不匹配[^]中的任意一个字符
var str = 'abc123';
var reg = /[1234567890]/;
var reg1 = /[^1234567890]/;
console.log(reg.exec(str), reg1.exec(str)); // 1 a
// 0-9表示:0123456789
// a-z表示: 小写a到小写z之间的所有的字母
// A-Z表示: 大写a到大写Z之间的所有的字母
var reg = /[0-9a-zA-Z]/;
var str = '.!@##$$a1';
console.log(reg.exec(str));

\d \D

// 2. \d:匹配数字 \D:匹配非数字
var str = 'str123';
var reg = /\d/;
var reg1 = /\D/;
console.log(reg.exec(str), reg1.exec(str));

\w \W

// 4. \w: 匹配数字、字母、_中的任意一个  \W: 不匹配数字、字母、_中的任意一个
var str = '!@##$_123qwe';
var reg = /\w/;
var reg1 = /\W/;
console.log(reg.exec(str), reg1.exec(str)); // _   !

\s \S

// 5. \s: 匹配空格  \S: 不匹配空格
var str = 'you are a beautiful girl';
var reg = /\s/;
var reg1 = /\S/;
console.log(reg.exec(str), reg1.exec(str)); // 空格 y

\b \B

// 6. \b: 匹配单词边界  \B: 匹配非单词边界
// 一个字母有2个边界
var str = 'you are a beautiful girl';
var reg = /\ba\b/;
var reg1 = /\ba\B/;
var reg2 = /\Ba\B/;
console.log(reg.exec(str), reg1.exec(str), reg2.exec(str)); // a are beautiful

^ $

// 7. ^a: 开头 以a为开头的a   a$: 以a为结尾的a
// 一起用: 有具体的长度 6-18位 规律性: 银行卡密码  手机号  身份证号
var str = 'we are web0712';
var reg = /^w/;
var reg1 = /\d$/;
console.log(reg.exec(str), reg1.exec(str));


// 银行卡密码正则:
// 6位
var reg = /^\d\d\d\d\d\d$/;
var str = '123456';
console.log(reg.test(str));

量词

a? : 匹配0个或者1个a 只匹配字符串的第一项

var str = 'str123';
var reg = /\d?/;
var reg = /[a-z]?/;
console.log(reg.exec(str));

*

a* : 匹配0个或者 连续 多个a 尽可能多的做匹配 只匹配字符串的第一项

var str = 'wertyuiodfghjk23456789sdfghj44567';
var reg = /\d*/;
var reg = /[a-z]*/;
console.log(reg.exec(str));

+

a+ : 匹配连续多个a 至少匹配1个 尽可能多的做匹配

var str = 'wertyuiodfghjk23456789sdfghj44567';
var reg = /\d+/;
var reg = /[a-z]+/;
console.log(reg.exec(str));

{m,n}

a{m,n} : 匹配至少m次最多n次的a 尽可能多的做匹配

a{m,} : 匹配至少m次

a{n} : 只匹配n次

,后面绝对不能加空格

var str = 'wtyuiosghjkxcvbnmsdxcvb';
var reg = /[a-z]{5,10}/;
console.log(reg.exec(str)); // wtyuiosghj
var reg = /[a-z]{1,}/;
console.log(reg.exec(str)); // wtyuiosghjkxcvbnmsdxcvb
var reg = /[a-z]{10}/;
console.log(reg.exec(str)); // wtyuiosghj

或和分组

|

|: 或 匹配|左边或者右边

var reg = /web1|web2/;
var str = 'web0712web1web2';
console.log(reg.exec(str)); // web1

()

(): 和 提高匹配的层级

()匹配到的结果可以通过其他属性得到 $1$2:获取第几个()匹配到的结果 RegExp.$1

var reg = /web(1|2)/;
var str = 'web2web0712web1';
console.log(reg.exec(str)); // web2  ['web2', '2', index: 0, input: 'web2web0712web1', groups: undefined]
console.log(RegExp.$1);


// 手机号的加密: 13322221111   133****1111
// 写正则分成3
var reg = /^(1[3-9]\d)(\d{4})(\d{4})$/;
var str = '13322221111';
console.log(reg.exec(str));
// 替换 $1  $3 第一个小括号和第三个小括号匹配到的结果
console.log(str.replace(reg, '$1****$3'));

特殊

(?:) : 非获取匹配

var str = 'web1web2';
var reg = /web(?:1|2)/;
console.log(reg.exec(str));

(?=)

a(?=b) : 匹配后面必须跟b的a

var str = 'webabcweb123';
var reg = /web(?=\d)/; // 匹配web后面是数字的web
console.log(reg.exec(str));

(?!)

a(?!b) : 匹配 后面 不是 b 的 a

使用: 排除条件

var str = 'webabcweb123';
var reg = /web(?!\d)/; // 匹配web后面不是数字的web
console.log(reg.exec(str));  // ['web', index: 0, input: 'webabcweb123', groups: undefined]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值