js之正则表达式

作者: fenerchen | 来源:发表于2018-01-28 14:55 被阅读13次

什么是正则表达式

正则表达式是一个对象,来描述字符模式。ECMAScript 的RegExp 类表示正则表达式。

创建正则表达式

两种创建方式,一种是采用new 运算符,另一种是采用字面量方式。

var box=new RegExp('box','ig');
//第一个是参数字符串,第二个是模式,可选
参数 含义
i 忽略大小写
g 全局匹配
m 多行匹配
var box=/box/ig
//字面量方式,用//表示,第二个/后面是模式修饰符

测试正则表达式

RegExp有两个测试方法:test()和exec()。test()方法在字符串中查找是否存在指定的正则表达式并返回布尔值,如果存在则返回true,不存
在则返回false。
1、RegExp 对象的主要方法是exec(),该方法是专门为捕获组而设计的。exec()接受一个参数,即要应用模式的字符串,然后返回包含第一个匹配项信息的数组;或者在没有匹配项的情况下返回null。返回的数组虽然是Array 的实例,但包含两个额外的属性:index 和input。其中,index 表示匹配项在字符串中的位置,而input 表示应用正则表达式的字符串。在数组中,第一项是与整个模式匹配的字符串,其他项是与模式中的捕获组匹配的字符串(如果模式中没有捕获组,则该数组只包含一项)。

var text = "mom and dad and baby";
var pattern = /mom( and dad( and baby)?)?/gi;
var matches = pattern.exec(text);
alert(matches.index); // 0
alert(matches.input); // "mom and dad and baby"
alert(matches[0]); // "mom and dad and baby"
alert(matches[1]); // " and dad and baby"
aler t(matches[2]); // " and baby"

说一下元组,数括号,上例中有两个括号,有2个捕获匹配元组,从外向内依次捕获匹配返回。matches[0]是整个匹配的字符串,后面1和2是捕获的元组。
2、对于exec()方法而言,即使在模式中设置了全局标志(g),它每次也只会返回一个匹配项。在不
设置全局标志的情况下,在同一个字符串上多次调用exec()将始终返回第一个匹配项的信息。而在设置全局标志的情况下,每次调用exec()则都会在字符串中继续查找新匹配项

var text = "cat, bat, sat, fat";
var pattern1 = /.at/;
var matches = pattern1.exec(text);
alert(matches.index); //0
alert(matches[0]); //cat
alert(pattern1.lastIndex); //0
matches = pattern1.exec(text);
alert(matches.index); //0
alert(matches[0]); //cat
alert(pattern1.lastIndex); //0
var pattern2 = /.at/g;
var matches = pattern2.exec(text);
alert(matches.index); //0
alert(matches[0]); //cat
alert(pattern2.lastIndex); //3
matches = pattern2.exec(text);
alert(matches.index); //5
alert(matches[0]); //bat
alert(pattern2.lastIndex); //8

test()和exec()方法的使用模式是:

正则表达式.(字符串)

使用字符串的正则表达式方法。使用方式是:字符串.方法(正则表达式)

方法 含义
match(pattern) 返回pattern 中的子串或null
replace(pattern, replacement) 用replacement 替换pattern
search(pattern) 返回字符串中pattern 开始位置
split(pattern) 返回字符串按指定pattern 拆分的数组
var pattern = /box/ig; //全局搜索
var str = 'This is a box!,That is a Box too';
var match=str.match(pattern)
console.log(match); //匹配到两个Box,Box
//输出(2) ["box", "Box"]

/使用search 来查找匹配数据/

var pattern = /box/ig;
var str = 'This is a Box!,That is a Box too';
alert(str.search(pattern)); //查找到返回位置,否则返回-1

PS:因为search 方法查找到即返回,也就是说无需g 全局

/*使用replace 替换匹配到的数据*/
var pattern = /box/ig;
var str = 'This is a Box!,That is a Box too';
alert(str.replace(pattern, 'Tom')); //将Box 替换成了Tom
/*使用split 拆分成字符串数组*/
var pattern = / /ig;
var str = 'This is a Box!,That is a Box too';
alert(str.split(pattern)); //将空格拆开分组成数组
//输出(8) ["This", "is", "a", "Box!,That", "is", "a", "Box", "too"]

获取控制

字符类:单个字符和数字

元字符/元符号 匹配情况
. 匹配除换行符外的任意字符
[a-z0-9] 匹配括号中的字符集中的任意字符
[^a-z0-9] 匹配任意不在括号中的字符集中的字符
\d 匹配数字
\D 匹配非数字,同[^0-9]相同
\w 匹配字母和数字及_
\W 匹配非字母和数字及_

字符类:空白字符

元字符/元符号 匹配情况
\0 匹配null字符
\b 匹配空格字符
\f 匹配进纸字符
\n 匹配换行符
\r 匹配回车字符
\t 匹配制表符
\s 匹配空白字符、空格、制表符和换行符

\S 匹配非空白字符

字符类:锚字符

元字符/元符号 匹配情况
^ 行首匹配
$ 行尾匹配
\A 只有匹配字符串开始处
\b 匹配单词边界,词在[]内时无效
\B 匹配非单词边界
\G 匹配当前搜索的开始位置
\Z 匹配字符串结束处或行尾
\z 只匹配字符串结束处

字符类:重复字符

元字符/元符号 匹配情况
x? 匹配0个或1个x
x* 匹配0个或任意多个x
x+ 匹配至少一个x
(xyz)+ 匹配至少一个(xyz)
x{m,n} 匹配最少m个、最多n个x
元字符/元符号 匹配情况
this|where|logo 匹配this或where或logo中任意一个

别的都好理解,重点说一说捕获分组和非捕获分组。

var pattern = /(\d+)([a-z])/;                   //捕获性分组
var str = '123abc';
console.log(pattern.exec(str));

输出(3) ["123a", "123", "a", index: 0, input: "123abc"]

var pattern = /(\d+)(?:[a-z])/;                   //非捕获性分组
var str = '123abc';
console.log(pattern.exec(str));

输出:(2) ["123a", "123", index: 0, input: "123abc"]
(?:[a-z])表示匹配[a-z]中的任意一个,但是不捕获输出,该括号中的元组不输出。

前瞻

前瞻:(?=)和(?!)
前瞻分为正向前瞻和反(负)向前瞻,正向前瞻(?=表达式)表示后面要有什么,反向前瞻(?!表达式)表示后面不能有什么。

前瞻分组会作为匹配校验,但不出现在匹配结果字符里面,而且不作为子匹配返回。

var pattern = /(\d+)(?=[a-z])/;                  
var str = '123ss';
console.log(pattern.exec(str));

输出(2) ["123", "123", index: 0, input: "123ss"]

后顾:(?<=)和(?<!) —JavaScript不支持

后顾分为正向后顾和反(负)向后顾,正向后顾(?<=表达式)表示前面要有什么,反向后顾(?<!表达式)表示前面不能有什么。

/正向后顾
(?<=abc) //前面需要有abc

//反向后顾
(?<!abc) //前面不能有abc

常用的正则

1.检查邮政编码
var pattern = /[1-9][0-9]{5}/;                  //共6位数字,第一位不能为0
var str = '224000';
alert(pattern.test(str));

2.检查文件压缩包
var pattern = /[\w]+\.zip|rar|gz/;              //\w表示所有数字和字母加下划线
var str = '123.zip';                            //\.表示匹配.,后面是一个选择
alert(pattern.test(str));

3.删除多余空格
var pattern = /\s/g;                            //g必须全局,才能全部匹配
var str = '111 222 333';
var result = str.replace(pattern,'');               //把空格匹配成无空格
alert(result);

4.删除首尾空格
var pattern = /^\s+/;                           //强制首
var str = '          goo  gle            ';
var result = str.replace(pattern, '');
pattern = /\s+$/;                           //强制尾
result = result.replace(pattern, '');
alert('|' + result + '|');

var pattern = /^\s*(.+?)\s*$/;                  //使用了非贪婪捕获
var str = '            google          ';
alert('|' + pattern.exec(str)[1] + '|');

var pattern = /^\s*(.+?)\s*$/;  
var str = '            google          ';
alert('|' + str.replace(pattern, '$1') + '|');          //使用了分组获取,两种都返回|google|

5.简单的电子邮件验证
var pattern = /^([a-zA-Z0-9_\.\-]+)@([a-zA-Z0-9_\.\-]+)\.([a-zA-Z]{2,4})$/;
var str = 'yc60.com@gmail.com';
alert(pattern.test(str));

var pattern = /^([\w\.\-]+)@([\w\.\-]+)\.([\w]{2,4})$/;
var str = 'yc60.com@gmail.com';
alert(pattern.test(str));

6、匹配ip地址
^(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}$

相关文章

网友评论

    本文标题:js之正则表达式

    本文链接:https://www.haomeiwen.com/subject/lbmoaxtx.html