正则表达式:一种用于匹配特殊字符的逻辑表达式。
var str = "hello__world中HELLO __ WORLD国 - width is 100 ok!";
var result = str.match("o"); // 匹配给定的字符串,匹配到就会立刻停止。返回一个数组
// result = str.search("o"); // 查询给的字符,匹配到就会返回字符所在的索引,没有就返回-1;
// match(reg),search(reg),replace(reg,"")可以传递一个正则表达式对象
console.log(result);
1. 要借助正则表达式对象创建正则表达式 RegExp(pattern,modifiers);
patter 正则表达式
modifiers 修饰符
g 全局匹配,把整个字符串查询完。这里会返回字符串里面所有的o字符
i 不区分大小写,不管大写字母,小写字母都可以匹配出来。
m 多行匹配,匹配多行字符串。
var patter = "o";
var reg = new RegExp(patter,"gi"); // 创建一个匹配o的正则表达式对象。匹配o的字符
var reg1 = /o/gi; // 快捷创建正则对象的方式,表达式不能用变量。
result = str.match(reg1); // 把正则表达式对象传给match,match可以按正则表达式逻辑匹配字符。
2. 正则表达式的模式
[wo] 范围查询,查询[]里面的任何字符。 查询[]里面的w或者o
[a-z] 查询 - 之间的连续内容, 查询a-z之间的任意字符,[A-z] 可以查询所有的大小写字母,[0-9]查询所有的数字,[a-z0-9]查询所有的字母和数字
(a|b) 查询以|分隔的任意选项。可以理解为或的意思。
[^wo] 匹配除wo以外的任意字符
var reg2 = /[a-z0-9]/gi;
var reg3 = /(hello)|(is)/gi;
var reg3a = /[^wo]/gi;
result = str.match(reg3a);
console.log(result);
3. 元字符
\d 匹配所有的数字
\D 匹配除了数字以外的任意字符
\w 匹配数字,字母,_
\W 匹配非数字,字母,_的字符
\s 匹配空白字符
var reg4 = /\d/g;
var reg5 = /\D/g;
var reg6 = /\W/g;
var reg7 = /\s/g;
// console.log(str.replace(reg7,""));
// console.log(str.match(reg6));
4. 匹配中文字符,一般匹配所有中文字符要去匹配中文字符对应的Unicode编码。
u Unicode编码匹配修饰符。
var reg8 = /\p{Unified_Ideograph}/gu;
result = str.match(reg8);
console.log(result);
5. 量词,匹配字符出现的次数。可以开启贪婪模式(匹配符合规则最多字符)
o+ 匹配至少1个x以上的字符
o* 匹配0(包含0)个以上的字符
o? 匹配0个或者1个
{min,max} 自定义匹配数量,min是最小匹配的数量,max是最多匹配的数量
o{3} 匹配3个o,指定匹配数量
o{1,} 和+一样,1个o以上
var str1 = "go google gooogle boold";
var reg9 = /go{0,3}/g;
result = str1.match(reg9);
console.log(result);
6. 正则转义符,有一些特殊符号是正则表达式的语法,要匹配这些特殊符号就要用 \转义。
var str = "hello[]33234";
var reg11 = /\[\]/g;
console.log(str.match(reg11));
7. 常用的特殊字符
^h 匹配字符串的开头(这里是匹配以h字符开头)。
h$ 匹配以某个字符结尾(这里就是匹配以h结尾的字符);
. 匹配任意字符,如果要匹配.,则要用转义符如: reg = /\./g
var str3 = " hello world.com";
console.log(str3.match(rega));
var rega = /d$/;
用户名的规则: 必须以字母开头,长度在4-6个字符之间的字母,数字或者下划线。
var regb = /^[A-z]\w{3,5}$/;
console.log(regb.test("c235b5"));
reg = /./g;
console.log(str3.match(reg),"点");
8. test()方法,可以验证字符串是否符合一个正则。符合规则返回true,不符合返回false;
var regc = /ae/g;
// console.log(regc.test(str3)); // str3里面不包含ae,返回false
9. 断言(环视),预判字符的某个位置是指定的字符。
0宽断言,预判字符是否存在,但是不会显示出来
var str = "hell1o123 helloworld hello10-";
01. o(?=exp) 0宽度正预测(先行断言),字符o后面能发匹配表达式(如果匹配只会返回o,表达式的匹配不会返回);
匹配后面有123的o字符
var reg = /hello(?=123)/g;
var reg1 = /o(?=[A-z]+)/g; // 匹配后面紧接着字母的o
console.log(str.match(reg1));
02. o(?!exp) 0宽度负预测先行断言。o后面不挨着某个表达式的正则,不会返回断言的内容
reg = /o(?!\d+)/g;
console.log(str.match(reg));
03. 零宽度正回顾断言 (?<=exp)
reg = /(?<=[A-z])o/g; // 匹配前面挨着字母的o,不会返回返回断言的内容。
console.log(str.match(reg));
04. 零宽度正回顾断言不匹配 (?<!exp)
reg = /(?<![A-z])o/g; // 匹配前面没有挨着字母的o,不会返回返回断言的内容。
console.log(str.match(reg));
复杂密码校验:必须包含至少包含一个数字、字母、下划线的组合,长度是3-6位置。
/* 以字母开头,必须包含数字,字母,_(下划线)的组合,长度是6-10位。 */
var reg = /^(?=.*[a-z])(?=.*\d)(?=.*_)[a-z]\w{5,9}$/gi;