正则表达式
正则的创建规则
- /abcd/;
- new RegExp(“abcd”);
正则的元字符
就是用来描述内容的一些符号
- “.”(点)
表示:非换行的任意字符。
var reg =/./;
var str ="afagdage";
var str1 ="\n";
var str2 ="agdgb\nfagd";
console.log(reg.test(str));//=true;
console.log(reg.test(str1));//=false;
console.log(reg.test(str2));//=true;
- "\ "(斜线)
表示:转译,把有意义的变成没有意义的;把没有意义的变为有意义的;
var reg = /\./;//把原本有意义的“.”转成没有意义的字符“.” 不再表示非换行的任意字符;
var str = "abc";
var str1 ="a.bc";
console.log(reg.test(str));//=false;
console.log(reg.test(str1));//= true;
- “\s”(斜杠小写s)
表示:空格
var reg =/\s/;//判断字符串中是否包含空格
var str ="abcds";
var str1= "ab cds";
console.log(reg.test(str));//=false;
console.log(reg.test(str1));//= true;
- “\S”(斜杠大写S)
表示:非空格
var reg =/\S/;//判断字符床中是否包含非空格
var str =" ";
var str1=" a ";
console.log(str);//=false;
console.log(str1);//= true;
- “\d”
表示:包含一个数字
var reg =/\d/;//判断字符串中是否包含数字
var str ="abcd";
var str1 ="abcd1";
console.log(str);//=false;
console.log(str1);//= true;
- “\D”
表示字符串中需要包含一个非数字
var reg =/\D/;//判断字符串中是否包含非数字
var str ="123455";
var str1 ="12345a";
console.log(str);//=false;
console.log(str1);//= true;
- “\w”(斜杠小写w)
表示:数字、字母、下划线
var reg =/\w/;//判断字符串中是否包含数字 字母 下划线
var str ="@#¥%%……&";
var str1 ="@#¥%%……&a";
var str2 ="@#¥%%……&7";
var str3 ="_@#¥%%……&";
console.log(str);//=false;
console.log(str1);//= true;
console.log(str2);//=true;
console.log(str3);//= true;
- “\W”(斜杠大写W)
表示:非数字、字母、下划线
var reg =/\W/;//判断字符串中是否包含非数字 字母 下划线
var str ="_2A%$";
var str1 ="_2A";
console.log(str);//=true;
console.log(str1);//= false;
正则的边界符
用来限制正则的边界,也是限制字符串的边界
- “^”
表示:开始
var reg = /^abcd/;//判断字符串是不是以a开头并且和bcd连着
var str = "gabcdfaf"
var str1="abcdfafg";
console.log(reg.test(str));//=false;
console.log(reg.test(str1));//=true;
- “$”
表示:结束
var reg = /abcd$/;//判断字符串是不是以d结尾并且和abc连着
var str = "abcdfaf"
var str1="fafgabcd";
console.log(reg.test(str));//=false;
console.log(reg.test(str1));//=true;
- 综合开始和结束的边界符
var reg = /^abcd$/;//判断字符串是不是以a开头以d结尾并且都和bc连着
var str = "abcde"
var str1="abcd";
console.log(reg.test(str));//=false;
console.log(reg.test(str1));//=true;
元字符和边界符的小例子
var reg = /^\d$/;//开头和结束都是数字并且只有一个字符
var reg1 = /^\d\d\d\d$/;//开头和结束都是数字并且中间连着2个数字
var str = "1"
var str1="1234";
console.log(reg.test(str));//=true;
console.log(reg1.test(str));//=false;
console.log(reg.test(str1));//=false;
console.log(reg1.test(str1));//=true;
正则的限定符
用来描述每一个正则 “元字符” 出现的次数
- “+”
表示1到正无穷次
var reg = /\d+/;//判断字符串是否包含最少一个数字
var str = "abcde"
var str1="abcde123";
console.log(reg.test(str));//=false;
console.log(reg.test(str1));//=true;
var reg1=/^\d+$/;//表示字符串只能由一位及其以上的数字组成
var str2 = "ab1234"
var str3="123456";
var str4 ="";
console.log(reg.test(str2));//=false;
console.log(reg.test(str3));//=true;
console.log(reg.test(str4));//=false;
- “*”
表示0到正无穷次
var reg = /\d*/;//判断字符串是否包含最少0个数字
var str = "abcde"
var str1="abcde123";
console.log(reg.test(str));//=true;
console.log(reg.test(str1));//=true;
var reg1=/^\d*$/;//表示字符串只能由0位及其以上的数字组成
var str2 = "ab1234"
var str3="123456";
var str4 ="";
console.log(reg.test(str2));//=false;
console.log(reg.test(str3));//=true;
console.log(reg.test(str4));//=true;
- “?”
表示0或者1次
var reg = /\d?/;//判断字符串是否(包含)0个或者1个数字
var reg1=/^\d?$/;//判断字符串是否(只能)由0个或者1个数字
var str = "abcd1"
var str1="abcd12";
var str2="abcd";
var str3="";
var str4="1";
var str5="12";
console.log(reg.test(str));//=true;
console.log(reg.test(str1));//=true;
console.log(reg.test(str2));//=true;
console.log(reg.test(str3));//=true;
console.log(reg.test(str4));//=true;
console.log(reg.test(str5));//=true;
console.log(reg1.test(str));//=false;
console.log(reg1.test(str1));//=false;
console.log(reg1.test(str2));//=false;
console.log(reg1.test(str3));//=true;
console.log(reg1.test(str4));//=true;
console.log(reg1.test(str5));//=false;
- “{n}”
表示n次
var reg = /\d{3}/;//判断字符串是否(包含)1个 3个数字连着 的字符片段
var reg1=/^\d{3}$/;//判断字符串是否(只能)由1个 3个数字连着 的字符片段
var str = "abcd1"
var str1="abcd159";
var str2="abcd15903";
var str3="";
var str4="159";
var str5="15903";
console.log(reg.test(str));//=false;
console.log(reg.test(str1));//=true;
console.log(reg.test(str2));//=true;
console.log(reg.test(str3));//=false;
console.log(reg.test(str4));//=true;
console.log(reg.test(str5));//=true;
console.log(reg1.test(str));//=false;
console.log(reg1.test(str1));//=false;
console.log(reg1.test(str2));//=false;
console.log(reg1.test(str3));//=false;
console.log(reg1.test(str4));//=true;
console.log(reg1.test(str5));//=false;
- “{n,}”
表示至少n次
var reg = /\d{3,}/;//判断字符串是否最少(包含)1个 3个数字连着 的字符片段
var reg1=/^\d{3,}$/;//判断字符串是否(只能)由1个 最少3个数字连着 的字符片段
var str = "abcd1"
var str1="abcd159";
var str2="abcd15903";
var str3="";
var str4="159";
var str5="15903";
console.log(reg.test(str));//=false;
console.log(reg.test(str1));//=true;
console.log(reg.test(str2));//=true;
console.log(reg.test(str3));//=false;
console.log(reg.test(str4));//=true;
console.log(reg.test(str5));//=true;
console.log(reg1.test(str));//=false;
console.log(reg1.test(str1));//=false;
console.log(reg1.test(str2));//=false;
console.log(reg1.test(str3));//=false;
console.log(reg1.test(str4));//=true;
console.log(reg1.test(str5));//=true;
- “{n,m}”
表示至少n次之多m次
var reg = /\d{1,3}/;//判断字符串是否(包含)1个 最少1个最多3个数字连着 的字符片段
var reg1=/^\d{1,3}$/;//表示字符串只能由1到3位数字组成
var str = "abcd1"
var str1="abcd159";
var str2="abcd15903";
var str3="";
var str4="159";
var str5="15903";
console.log(reg.test(str));//=true;
console.log(reg.test(str1));//=true;
console.log(reg.test(str2));//=true;
console.log(reg.test(str3));//=false;
console.log(reg.test(str4));//=true;
console.log(reg.test(str5));//=true;
console.log(reg1.test(str));//=false;
console.log(reg1.test(str1));//=false;
console.log(reg1.test(str2));//=false;
console.log(reg1.test(str3));//=false;
console.log(reg1.test(str4));//=true;
console.log(reg1.test(str5));//=false;
小例子
问题:写一个0~678数字的验证正则
var str ="555";
// \d|\d{2} 一位数两位数都可以 6[0-6]\d 百位数是6十位数小于等于6个位数为任意数字都可以
//67[0-8] 百位数是6十位数是7个位数小于等于8都可以
var reg =/^(\d|\d{2}|[1-5]\d{2}|6[0-6]\d|67[0-8])$/;
console.log(reg.test(str));//如果str<678输出结果就为true,否则为false;
特殊符号
- “()”
- 表示一个集合
var reg = /^abcd{2}$/;//表示从开头到结尾需要abcdd字符串(^只修饰其后面的一个字符 $ 只修饰其前面一个字符)
var reg1=/^(abcd){2}$/;//表示从开头到结尾需要abcdabcd字符串(^和$修饰紧挨着的括号内的整体)
var str = "abcdabcd"
var str1="abcdd";
console.log(reg.test(str));//=false;
console.log(reg.test(str1));//=true;
console.log(reg1.test(str));//=true;
console.log(reg1.test(str1));//=false;
- 再捕获的时候单独捕获(exec())
- 如果正则中有小括号,会把小括号中的内容单独捕获出来,按照从左到右的顺序看小括号开始“(” 索引0位全部字符串捕获,小括号捕获从索引1开始
var reg =/((\d+)([a-zA-Z]{3}))/; var str = "1abc12abc123abc"; var res = reg.exec(str);//=["1abc","1abc","1","abc"] console.log(res);
- “[]”
表示一个任意选择的集合,出现在中括号内的内容,出现任意一次就行
var reg = /^[abcd]{2}$/;//表示字符串从开头到结尾只能 由a或者b或者c或者d组成的两个字符
var str = "aa"
var str1="ab";
var str2="ae";
console.log(reg.test(str));//=true;
console.log(reg.test(str1));//=true;
console.log(reg.test(str2));//=false;
- “[^]”
表示一个非任意选择的集合,出现在这个符号中的任意一个字符都不能出现
var reg = /^[^abcd]$/;//表示这一位字符不能是a/b/c/d
var str = "a"
var str1="b";
var str2="e";
console.log(reg.test(str));//=false;
console.log(reg.test(str1));//=false;
console.log(reg.test(str2));//=true;
- “|”
或(一般和"()"一块使用)
var reg = /^(163|162|161)$/;//表示字符串要么是163要么是162要么是161
var str = "163"
var str1="162";
var str2="168";
console.log(reg.test(str));//=true;
console.log(reg.test(str1));//=true;
console.log(reg.test(str2));//=false;
- “-”(英文状态中划线)
表示:到(必须是 ASCII 编码是挨着的),一般和“[]”一块使用。
[0-9]等价于\d [^0-9]等价于\D [0-9a-zA-Z_]等价于\w [^0-9a-zA-Z_]等价于\W
var reg = /^[a-z]$/;//表示这一个字符是 a至z 26个小写英文字母中的任意一个
var str = "m"
var str1="M";
var str2="1";
console.log(reg.test(str));//=true;
console.log(reg.test(str1));//=false;
console.log(reg.test(str2));//=false;
正则的方法
- 匹配
- test()
就是检测字符串是否符合规则,返回bool值
- 捕获
- exec()
就是把字符串中符合要求的那一段字符单独拿出来
- 语法:
正则表达式.exec(要捕获的字符串); 返回值为一个数组,
数组第0项是按照正则要求捕获出来的内容,
index:表示找到的字符片段是从哪一个索引开始的
input:表示原始字符串
特性:懒惰性,只找到一个符合规则的就返回结果执行完毕,下次再捕获还是从索引0开始
对一个字符串同一个正则进行捕获,每次结果都相同;
- 标识符
- g (表示全局的意思)
书写在正则表达式后面(/[0-9]/g) 当正则表达式有了标识符g的时候,会在第二次捕获的时候从第一次捕获的结尾处开始查找,
如果没有找到返回null,当返回null的时候下一次再捕获又会从索引0开始捕获
var reg = /\d{3}/;
var reg1=/\d{3}/g;
var str = "agadgdag123agadga456geagag7891"
var res = reg.exec(str);
var res1 = reg.exec(str);
var res2 = reg1.exec(str);
var res3 = reg1.exec(str);
console.log(res);//res[0]=123 res.index=8 res.input=str
console.log(res1);//res1[0]=123 res1.index=8 res1.input=str
console.log(res2);//res[0]=123 res.index=8 res.input=str
console.log(res3);//res1[0]=456 res1.index=17 res1.input=str
- 循环捕获
var str = "agadgdag123agadga456geagag7891";
var reg=/\d{3}/g;
var arr=[];
var res = reg.exec(str)
while(res){
arr.push(res[0]);
res = reg.exec(str);
}
console.log(arr);//=["123","456","789"];
字符串和正则合作的方法
- search();
语法:字符串.search(正则或者需要寻找的字符串);
返回值:如果找到就返回字符串片段开始的索引,没找到就返回-1;
var reg=/(123)/;
var str ="abcd123abcd123";
var res = str.search("123");//判断字符串是否包含“123”
var res1 = str.search(reg);//判断字符串是否包含“123”
console.log(res);//=4
console.log(res1);//=4
- match();
语法:字符串.match(正则或者需要寻找的字符串);
返回值:当正则没有全局标识符g的时候,和exec捕获方法一样,当正则有全局标识符g的时候,返回值是捕获到的每一个内容,以一个数组的形式返回
var reg =/\d{3}/;
var reg1=/\d{3}/g;
var str ="abcd123abcd456aaa";
var res = str.match(reg);
var res1 = str.match(reg1);
console.log(res);//和exec()得到的结果一样 res[0]=123 res.index=4 res.input=str
console.log(res1);//["123","456"]
- replace();
语法:字符串.replace(正则);
返回值:没有全局标识符“g”的时候,只替换发现的第一个,有全局“g”的时候替换发现所有的,然后返回替换之后的字符串
var reg =/HH/;
var reg1=/HH/g;
var str ="abcHHdefHHghi";
var res = str.replace(reg);
var res1 = str.replace(reg1);
console.log(res,"**");//"abc**defHHghi"
console.log(res1,"**");//"abc**def**ghi"