正则表达式

正则表达式

  是由普通字符及特殊字符(元字符)组成的对字符串进行过滤的逻辑公式。

正则表达式图形化工具

https://regexper.com/

正则表达式的创建

1、字面量

// 以/斜杆开始和结束,中间部分为需要匹配的字符串
var reg = /abc/;

2、构造函数

// 构造函数中第一个参数为需要匹配的字符串
var reg1 = new RegExp("abc");

正则表达式的方法

1、test()是正则表达式的方法
返回一个布尔值,如果要检测是字符串(test参数)中含有某个子串(正则定义),返回true

var reg = /study1/i;                //字面量方式,在最右加i,表示不区分大小写
console.log(reg.test("sTuDy111"));  //true

var reg = new RegExp("STUdy","i");  //构造函数方式不区分大小写,把i作为第二个参数
console.log(reg.test("asstudyy"));  //true

2、exec()方法,返回一个伪数组,将匹配成功的内容返回
如果没有匹配,返回null

var reg = /day/i;
console.log( 
	reg.exec("good good study, Day Day up")
	//返回的类数组对象中的index表示匹配的子串在字符串中的位置
);
//["Day", index: 17, input: "good good study, Day Day up", groups: undefined]

//字母g 表示在匹配内容时,全局搜索
//在使用exec方法时,正则表达式不是全局匹配,则每次从0位置开始
var reg = /day/ig;
console.log(reg.exec("day aday up"));
// ["day", index: 0, input: "day aday up", groups: undefined]
console.log(reg.exec("day aday up"));
// ["day", index: 5, input: "day aday up", groups: undefined]
console.log(reg.exec("day aday up"));
// null

字符串中的方法

1、replace(),替换

var str = "google tbc goole Tmd TMD abc tmd";
var reg= new RegExp("tmd","ig"); 
console.log(str.replace(reg,"*"));//用*号去替换正则表达式匹配到的内容(子串)
// google tbc goole * * abc *

2、match(),将匹配到的结果都放入数组中,并返回

var pattern = /good/ig;   
var str = 'Good good GOoD study!,day day up!';
var arr = str.match(pattern);  //将匹配到的结果都放入数组当中,并返回
console.log(arr);
// ["Good", "good", "GOoD"]

match方法如果全局搜索时,返回的是数组,数组中的元素值为匹配到的字符。
如果不是全局搜索,返回的内容与exec方法返回值类似。

var pattern = /good/i;   
var str = 'Good good GOoD study!,day day up!';
var arr = str.match(pattern);  //将匹配到的结果都放入数组当中,并返回
console.log(arr);
// ["Good", index: 0, input: "Good good GOoD study!,day day up!", groups: undefined]

3、search()方法,查找符合正则的子串的位置,只返回第一个匹配的位置索引

var pattern = /good/ig;
var str = 'aGood good good study!,day day up!';
console.log(str.search(pattern));
// 1

4、split()方法,分割,返回的是数组

var str = 'Gxxd good study! day day up!';
console.log(str.split(/g..d/i));
// ["", " ", " study! day day up!"]

元字符

1、 .元字符,代表除换行之外的所有单个字符

var reg = /g..gle/ig;
var str = "gooaggleg-ggle";
console.log(reg.test(str)); // true
console.log(str.match(reg)); // ["g-ggle"]
// 注,match方法全局搜索时,返回的是数组,即使只有一个元素也是数组

2、 *元字符,重复前的单个字符的(0-n)次匹配

var reg = /aa.*gle/ig;
var str = "bbaaglecc";
console.log(reg.test(str)); // true
console.log(str.match(reg)); //["aagle"]
// *前面的是.即任意单个字符,可有0个或多个

3、 +元字符,+前的单个字符至少一次匹配

var reg = /aa.+gle/ig;
var str = "bbaaglecc";
console.log(reg.test(str)); // false
console.log(str.match(reg)); //null
// +前面的是.即任意单个字符,+前的单个字符至少一次匹配

4、 ?元字符,?前的单个字符出现0-1次,(贪婪匹配),如果有就匹配上

var reg = /g?gle/ig; 
var str = "g?ggle";
console.log(reg.test(str)); // true
console.log(str.match(reg)); // ["ggle"]
// ?前面的是g,出现0次或1次,即gle或ggle都可匹配
// 正则为贪婪匹配,即尽可能多的匹配字符

5、 \转义字符,将特殊字符当做普通字符看待

var str = "abc\\nss";
// 原本\n会打印换行,此时在\n前加了转义字符,就变成了普通字符打印
console.log(str); //abc\nss

6、 []表示字符可以出现的范围,如[a-z]

var reg = /g[0-9a-zA-Z_]+gle/g; 
var str = "agglegle";
console.log(reg.test(str)); // true
console.log(str.match(reg)); // ["gglegle"]

7、 \w 等价于[a-zA-Z0-9_] //字母数字下划线
\W 非字母数字下划线

var reg = /a\wc/g;
var str = "awwwwcabc";
console.log(reg.test(str)); // true
console.log(str.match(reg)); // ["abc"]

8、 \d 等价于[0-9] //数字

\D{7,}匹配至少 7个非数字(相当于[^0-9]{7,})
var reg = /g\d+g/g;
var str = "gg01243gle";
console.log(reg.test(str)); // true
console.log(str.match(reg)); // ["g01243g"]

9、 /^ 匹配开始 $/ 匹配结尾

var reg = /^c.+ab$/;  
var str = "bcaaaaaaaaab";
console.log(reg.test(str)); // false
console.log(str.match(reg)); // null
// 虽然str中存在c开头的ab结尾的字符串,但由于并不是以c开头,故不匹配

10、 \s 匹配空格

var str = "gogle google  gooogle   goooole";
console.log(str.replace(/\s/g, ""));
// goglegooglegoooglegoooole
// 找到所有的空格,用空字符串替换;用这种方法可除去字符串中的所有空格

11、 \b 可以匹配是否到了边界, 把str当成一个单词来搜索

var reg = /google\b/g;
var str2 = 'aagoogle xxgooglea';
console.log(reg.test(str2)); // true
console.log(str2.search(reg)); // 2
// 索引值为2处,找到了匹配的字符串

12、 | 代表或者的意思 匹配其中一种字符串

var pattern = /google|baidu|bing|yahoo/;

13、 () 加上小括号 将内容进行分组,可以作为一个整体进行多次匹配

var pattern = /(google){4,8}/g; //匹配分组里的字符串 4-8 次"googlegooglegoogle"

14、 将()分组内容进行替换

var pattern = /(.*)\s(.*)/;
var str = "baidu taobao";
console.log(str.replace(pattern, "$2 $1"));
// taobao baidu

补充

可能会有一种情况,全局搜索时,可能第二次搜索时取到null,这是由于正则有一个默认属性,lastIndex,即下次检索时的默认索引值,全局搜索时会改变lastIndex的值。

var pattern = /^([a-z]+)\s([0-9]{4})$/ig;
var str = 'google 2012';
console.log(pattern.test(str)); // true
console.log(pattern.lastIndex); // 11
console.log(pattern.exec(str)); // null

解决方案:

var pattern = /^([a-z]+)\s([0-9]{4})$/ig; //使用分组
var str = 'google 2012';
console.log(pattern.test(str)); // true
pattern.lastIndex = 0;          // 把lastIndex清空
console.log(pattern.lastIndex); // 0
console.log(pattern.exec(str)); 
// ["google 2012", "google", "2012", index: 0, input: "google 2012", groups: undefined]
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值