什么是正则表达式
正则表达式是一个对象,来描述字符模式。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}$
网友评论