正则表达式

正则表达式概念

1.正则表达式,由人提供给计算机,让计算机能够读懂人类的规则。它的优缺点:可以大大简化代码;性能也比正常的函数方法要好;但只能操作字符串。

2.正则表达式的声明:推荐使用字面量写法。

var re = /a/;  //字面量写法
var re = new RegExp('a');   //构造函数实例化写法

3.正则表达式不能传参,或者说两个/里面的只是正则的规则,不能是字符串、布尔值甚至变量,因此如果我们想要传参,必须用构造函数实例化写法:

var a = "abc";
var re = /a/;   //这里的a既不是变量a,也不是字符串a,而是匹配a
var re = new RegExp(a);  //变量a
正则元字符

正则表达式语言由两种基本字符类型组成:原义(正常)文本字符和元字符。元字符使正则表达式具有处理能力。所谓元字符就是指那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。

常用元字符:

  • .: 匹配除换行符以外的任意字符
  • \w:匹配字母或数字或下划线
  • \s: 匹配任意的空白符
  • \d:匹配数字
  • \b:匹配单词的开始或结束的位置(包含空格)
  • ^: 匹配行的开始
  • $: 匹配行的结束

常用反义元字符:

  • \W: 匹配任意不是字母,数字,下划线的字符
  • \S: 匹配任意不是空白符的字符
  • \D: 匹配任意非数字的字符
  • \B: 匹配不是单词开头或结束的位置(包含空格)
  • [^x]: 匹配除了x以外的任意字符
正则标识符

1.标识符:不区分大小写/i和全局匹配/g

var re1 = /aa/i;   //匹配aa字符,无论大小
var re2 = /a/g;   //全局匹配,不会在匹配成功一次后结束匹配
var re3 = new RegExp("a","g");  //构造函数声明正则时标识符写法

2.重复限定符:

  • *: 重复零次或更多次
  • +: 重复一次或更多次
  • ?: 重复零次或一次
  • {n}: 重复n次
  • {n,}: 重复n次或更多次
  • {n,m}:重复n到m次
正则查询、收集和替换方法

1.test方法:匹配字符串,如果成功就返回真,失败则返回假。

var str = 'b abcdef';
var re1 = /bd/;     //里面必须是连续整体
var re2 = /\ba/;  //a的前面为单词的开始或结束
console.log(re1.test(str));  //fasle
console.log(re2.test(str))  //true,a前面是单词的开始

2.search方法:返回匹配字符串成功的位置,如果失败就返回-1(类似indexOf)。

var str = 'abcdef';
var re = /B/i;  //在正则里默认是区分大小写的
console.log(str.search(re)); 

3.match方法:匹配成功返回数组,如果失败就返回null。

str.match(/\d+/g); 

全局匹配一次或多次的数字,将匹配到的结果放入数组并返回。

4.replace方法:匹配成功的字符会替换成新的字符串,第二个参数可以是字符串也可以是回调函数,回调函数的第一个参数就是每次匹配成功的字符,如:

var str = 'aaa';
var re = /a/;
//方式一
str = str.replace(re,'b');
//方式二
str = str.replace(re,function ($0){  
    return "b";  
})
console.log(str);
正则匹配子项

1.上一个例子中匹配成功的完整字符串$0称为母体,而在正则表达式中的小括号里匹配的叫做子项,从左向右依次为第一个子项,第二个子项…,因为直接操作母体往往会比较麻烦,可以把母体分割成多个子项去操作。

2.replace方法里的第一个参数$0计做母体,第二个开始的参数$1、$2…计做第一个子项、第二个子项…

var str='2017-6-1';
str.replace(/(\d+)(-)/,function($0,$1,$2){
    console.log($0);  
    console.log($1);  
    console.log($2);  
})
//结果
//2017-
//2017(母体中被第一个括号匹配的部分)
//- (母体中被第二个括号匹配的部分)

3.匹配重复项:\n(n是个大于等于1,小于等于最大子项的整数),与第n个子项重复的项(复制第n个子项)

var re = /(\w)\1/; //匹配两次第一次匹配到的字符,如果写成\w\w就变成两个连续字符了
var reg=/(\d)(\d{2})\2/g;//匹配两次第二个子项中匹配到的字符。
var str="12323238888";
var reg=/(\d)(\d{2})\2/g;
str.replace(reg,function($0){
    console.log($0);
})
//结果
//12323
//38888
var str="12323238888";
var reg=/(\d)\1/g;
str.replace(reg,function($0){
    console.log($0);
})
//结果
//88
//88
正则匹配相似项

1.|:正则里的或运算,匹配|前面或后面的结果都是正确结果

2.[]:匹配[]内任意一项都算做成功匹配

3.-:连字符,在[]内使用,代表一个范围。不在[]使用,是匹配中划线。

4.^:放在[]内是排除项,放在外面是匹配开头(匹配结尾是$)。

5.贪婪和非贪婪匹配:重复限定符(*、+或?)都是贪婪的,会尽可能多的匹配文字,在它们的后面加上一个?就可以实现非贪婪匹配。

var str="123456789";
str.replace(/.+/,function($0){
    console.log($0);
})
str.replace(/.+?/,function($0){
    console.log($0);
})
//结果
//123456789
//1
零宽断言

1.用于查找在某些内容(但并不包括这些内容)之前或之后的东西,如\b,^,$那样用于指定一个位置,这个位置应该满足一定的条件(即断言),因此它们也被称为零宽断言(不占宽度的判断)。

2.在使用正则表达式时,捕获的内容前后必须是特定的内容,而我们又不想捕获这些特定内容的时候,零宽断言就可以派上用场了

零宽度正预测先行断言(?=exp):匹配的字符位置的右边必须匹配到exp这个表达式

零宽度负预测先行断言(?!exp):匹配的字符位置的右边不能匹配到exp这个表达式

零宽度正回顾后发断言(?<=exp):匹配的字符位置的左边必须匹配到exp这个表达式

零宽度负回顾后发断言(?<!exp):匹配的字符位置的左边不能匹配到exp这个表达式

var str = 'abc';
var re = /a(?=b)c/;
console.log(re.test(str));  // false
re = /a(?<=a)bc/;
console.log(re.test(str));  // true

//解释:第一个正则表达式,匹配ac并且a的右边是b(断言不占宽度),只满足第二个条件,匹配失败;第二个正则表达式,匹配abc并且b的左边是a,两个条件都满足,匹配成功。
正则表达式小练习
^\w+@[a-z0-9]+(\.[a-z]+){1,3}$
//匹配以一个或者多个字母或者数字或者下划线为开头,@并且满足在这之后有一个或者多个a-z或0-9,然后以1个到3个.1个到多个a-z字符结束。
//邮箱
//比如:2595269239@qq.com
//zhujinting@xiyou3g.com

a-zA-Z]+://[^\s]*
//[^\s]  除了空白符之外任意一个字符
//匹配有一个或者多个a-z以及A-Z,://,再加上除了空白符之外任意一个字符
//网址
//比如:http://baidu.com

[1-9][0-9]{4,9}
//匹配一个字符为1-9,接着匹配4个到9个0-9
//qq号
//比如:2333333333

[1-9]\d{5}
//匹配一个字符为1-9,接着匹配5个0-9
//邮政编码
//比如:712000

[1-9]\d{14}|[1-9]\d{17}|[1-9]\d{16}x
//匹配一个字符为1-9,接着匹配14个0-9或者匹配一个字符为1-9,接着匹配17个1-9或者匹配一个字符为1-9,接着匹配16个0-9再加一个x
//身份证号
//比如:61010101010101010x
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值