正则表达式相关:正则语法

189 阅读5分钟

正则表达式的创建可以用构造函数方式,也可以用字面量方式

reg是regular的缩写,RegExp是RegularExpression的缩写

var reg = new RegExp();

括号内有两个参数,第一个是正则的内容,第二个是匹配模式

比如查找字符a

var reg = new RegExp("a",i)

i是ignore忽略大小写的匹配模式

g是global全局模式

var reg = /a/i

此种书写方式表达的意思相同

如果要查找a或b,或,通过|表示

var reg = /a|b/i

var str = "acefg"

正则表达式的测试方式为test()方法

var result = reg.test(str);

console.log(result);

浏览器的输出结果为true

如果需要检查字符串中是否有字母,可以使用/[a-z]/i的方式,忽略大小写,如果不想用i,可以使用/[A-z]/

如果需要检查字符串中是否有adc,aec,afc,可以定义正则表达式/a[def]c/

如果需要包含查找除了什么以外的内容,可以使用/[^ab]/

var reg = /[^ab]/

str = "abc"

var result = reg.test(str);

console.log(result);

浏览器的返回结果为true,因为字符串中包含除了ab以外的c


正则表达式的应用:

利用正则表达式拆分字符

var str  = "1a2b3c4d5e";

var result = str.split(/[A-z]/);

console.log(result);

浏览器的输出结果为1,2,3,4,5

利用正则表达式搜索字符

var str = "hello abc hello aec afc";

var result = str.search(/a[A-z]c/);

console.log(result);

浏览器的输出结果为6,search()方法可以适配正则表达式,和indexOf()的使用方法类似,如果找到,返回索引位置,如果没找到,返回-1

利用正则表达式匹配字符

var str = "1a2e3c4f";

var result = str.match(/[a-z]/);

console.log(result);

但是系统只是匹配到a,之后就不再匹配了,如果需要全局匹配,可以定义匹配模式为g,如果希望忽略大小写,可以在g之后加入i

var result = str.match(/[a-z]/gi);

console.log(result);

浏览器输出的结果为a,e,c,f

利用正则表达式替换指定的字符

var str = "adadA";

var result = str.replace(/a/gi,"o( ̄▽ ̄)ブ");

console.log(result);

浏览器的输出结果为o( ̄▽ ̄)ブdo( ̄▽ ̄)ブdo( ̄▽ ̄)ブ

利用正则表达式确认字符串中是否包含重复的字符

var str = "aaab";

var reg = /a{3}/;

result = reg.test(str);

console.log(result);

浏览器的输出结果为true,其中{}包含的数字表示前面的字符连续几次出现,比如a{3},表示aaa,ab{3},表示abbb,(ab){3},表示ababab,ab{1,3},表示ab,abb,abbb都可以,{1,3}表示出现1次到3次,{1,}表示出现1次以上,也可以用+代替,比如ab+,表示a至少1个b,

利用正则表达式确认是否有a开头的字符串

var str = "bca";

var reg = /^a/;

console.log(reg.test(str));

浏览器的输出结果为false,^表示以某字符开头

var reg = /a$/;

console.log(reg.test(str));

浏览器的输出结果为true,$表示以某字符结尾

利用正则表达式核实手机号是否合规

var str = "138123456789";

var reg = /^1[3-9][0-9]{9}$/

console.log(reg.test(str));

浏览器的返回结果为true,其中正则表达式的部分分为三部分看,^1,表示需要以1开头,并且只需要1位即可,无需写{1};[3-9]表示,第二位需要为3-9之间的数字;[0-9]{9}$表示从第三位开始,要求是数字,且为9位,并以数字结尾

正则表达式中\w表示,任意的数字,字母,,相当于[A-z0-9]

正则表达式中\W表示,除了数字,字母,,相当于[^A-z0-9]

正则表达式中\d表示,任意数字,相当于[0-9]

正则表达式中\D表示,除了数字,相当于[^0-9]

正则表达式中\s表示,空格

正则表达式中\S表示,除了空格

正则表达式中\b表示,单词边界

var str = "hello children";

var reg = /child/;

console.log(reg.test(str));

浏览器的返回结果为true,但是并未达到我们的测试要求,我们要的是是否包含child这个单词,所以需要用到单词边界

var reg = /\bchild\b/;

console.log(reg.test(str));

浏览器的返回结果为false,字符串中并未包含child这个单词

利用正则表达式去除用户名输入框中的空格

var str = "     ad     min      ";

如果只想去掉用户名左侧的后右侧的空格,中间的空格不去掉

str = str.replace(/^/s*|/s*$/g,"");

console.log(str);

浏览器的输出结果为"ad    min",原理为,将用户名左侧的空格去掉,利用^和/s去掉以空格开头的字符,但是如果仅是这样,浏览器只会去掉一个,需要加一个*表示0个以上的对应字符;针对去掉右侧的空格,原理类似,只不过加一个$,引导浏览器删掉以0个以上的空格结尾的字符,两个正则中间加入|,表示或,但是如果仅是这样,浏览器认为已经删掉左侧空格,右侧的空格不删除也可以,所以需要加入全局g,全部的匹配规则的空格均需删除

利用正则表达式判断邮件格式是否合规

var str = "abc.hello@163.com"

确定正则表达式之前先对字符串进行分拆成几个部分进行分析,确定正则语句,

邮件格式可以分拆为:abc  .hello  @163  .com  .cn

针对第一部分abc 可以是字母,数字,下划线,用\w即可,但是邮件字符最少3个字符以上,可以加入量词设定,\w{3,}

针对第二部分.hello 可以是字母,数字,下划线,但是要以.开头,可以这样写 .\w,但是因为这部分不是必须有的,可有可无,可以加入*,0个以上,有没有都可以 (.\w)*

针对第三部分@163 可以是数字,字母,但不会是下划线,要求以@开头,可能是2-5位,要求至少出现1次,可以这样写 @[A-z0-9]{2,5}+

针对第四部分.com和第五部分.cn 可以是字母,要求以.开头,因为.cn和.com要求类似,可以设为是.com规则的复用,可能出现一次或者不出现,可能是2-5位,可以这样写(.[A-z]{2,5}){1,2}

最后记得将开头和结尾锁定,避免合规字符出现在不合规字符串中间却判断通过的情况,在第一部分之前加入^,在最后部分之后加入$

var emailReg = /^\w{3,}(.\w)*@[A-z0-9]{2,5}+(.[A-z]{2,5}){1,2}$/

console.log(emailReg(str));

浏览器的输出结果为true