正则就是对字符串进行处理,过滤筛选出我们需要的指定的字符串,这样增加了用户体验也减轻了服务器
的负担。(创建一个正则就想象成创建一个关键词,这个关键词去匹配一串字符串)
创建正则方法一:
var box=new RegExp('这里写要匹配的关键词','ig'); (第一个参数必选且必须是字符串,第二个可选修饰符)
i //忽略大小写
g //匹配全局,例如一行有很多关键词找到了其中一个关键词继续往后面找。
m //多行匹配
创建正则方法二(推荐):
var box=/这里写要匹配的关键词/ig
----------------------------
RegExp内置2个测试方法: test() exec()
test() //匹配字符串 返回的是布尔值
var box=new RegExp('Box','i'); //i 不区分大小写
var str='box';
alert(box.test(str)); //true
可以一句话写完
alert(/Box/i.test('box'));
简单的了解正则的作用
var box =new RegExp('Box','i');
var str='this is box';
alert(box.test(str)); //检查这段字符串中是否含有 模式中的正则。
exec() //匹配字符串 返回数组
var box =new RegExp('Box','i');
var str='this is box';
alert(box.exec(str)); //将能匹配成功的关键词组合成数组返回 没有就返回null
---------------------------------
String对象提供4个方法,可以使用在正则中
match() // 将匹配到的字符串 组合成 数组
replace() //替换字符串
search() //返回第一个匹配到的位置 索引从0开始,找不到返回-1。此方法默认忽略g
split() //此方法默认忽略g
match()例子
var box = new RegExp('Box','ig'); //这里要开启全局 不然只能匹配到第一个字符串就退出了
var str ='this is Box,that is box';
alert(str.match(box)); //返回一个数组 box,box
replace()例子
alert(str.replace(box,'tom')); // this is tom,that is tom
search()例子
alert(str.search(box)); //7 正则无需开启全局模式,只找到第一个关键词就退出
split()例子
var box = new RegExp(',','ig');
var str ='this is Box,that is box';
alert(str.split(box)); //通过 ,将字符串拆分成数组 此方法默认忽略g模式
RegExp对象的静态属性
var box=/google/i;
var str='this is a google!';
box.test(str); //*必须要执行一下,静态属性才有校(才能用以下方法)
alert(RegExp.input); // this is a google! 获取要匹配的那段字符串 Opera不支持
//alert(RegExp.leftContext); // this is a 获取关键词的左边内容
//alert(RegExp.rightContext); // ! 获取关键词的右边内容
//alert(RegExp.lastMatch); //在匹配全局模式下 获取到最后一个关键词 Opera不支持
//alert(RegExp.lastParen); Opera不支持
//alert(RegExp.multiline); IE不支持
RegExp对象实例属性 (功能没什么用)
----------------------------------------------------
以下开始就是重点了
获取控制
.点 // 可以匹配任意字符串,一个点代表匹配任意一位,多个点多位
var box=/g.ogle/;
var str='g2ogle'; //这里的2可以换成任意一个字符
alert(box.test(str)); //true
* // 可以匹配 0个 1个 或者 多个
var box=/go*ogle/; //*的前面是o ,就对前面的o起作用
var str='gogle'; //0个情况下
var str='google'; //1个情况下
var str='gooooooogle'; //多个情况下
var str='gbbogle'; //这样是匹配不到的,*的前面是o只能到匹配o的数量
+ // 至少1个 或者 多个 不能匹配0个
? // 0个 或者 1个
可以组合使用例如
var box=/g.?ogle/; // 在.?位置上可以放0个 或者任意一个字符串
{} // 重复匹配指定的范围
var box=/go{2,4}gle/; // o的数量只能是 2个到4个之间 可以是2个或者4个
var box=/go{3}gle/; //只能3个o
var box=/go{3,}gle/; //至少3个o
[] [a-z] // 任意匹配一位是26个字母中的其中一个 ,默认是区分大小写的如果不想就开启i
var box=/[a-z]oogle/; //26个字母任意匹配一个
var box=/[0-9]oogle/; //匹配0到9一个数字
注意一个例子:
var box=/[0-9]oogle/;
var str='444444444oogle'; //*这里也一样匹配成功因为匹配的是后面6位,不管是后6位还是前6位正则自动去寻找能匹配成功的一段字符串中的某一小段
alert(box.test(str)); //true
[a-zA-Z0-9_] 复合 //可以匹配到a-z或者A-Z或者0-9或者_ 任意一个字符
^ // 非
var box=/[^0-9]oogle/; //非 0到9的 任意一个字符,也就是任意一个字符都行只要不是0到9
^ //强制从头开始一个个字符对应的去匹配
var box=/^[0-9]oogle/;
var str='444444444oogle';
alert(box.test(str)); //false 这里就从头开始匹配了 一个个字符一一对应,而不是去匹配4oogle
$ //强制从字符串后面开始匹配
var box=/google$/;
var str='fadf3w3fsdfgoogle'; //关键词从后面开始匹配,参考上面一个例子就能理解。
插入一个例子:
var box
+ // 匹配 一个 或者 多个
var box = /[a-z0-9]+/;
var str='fa8sd9f8s09df8sd90f'; // true 只要是数字和字母组合成的都能匹配成功
\w // [a-zA-Z0-9_]
var box =/\woogle/; //意思就是在\w的位置上只能是a-z或者A-Z或者0-9任意一位。
\W // [^a-zA-Z0-9_]
\d // [0-9]
\D // [^0-9]
\s // 匹配一个空格
\S // 匹配 只要不是空格 的 任意一个字符
var box =/goog\sle/; // \s 可以 对应上字符串的空格
var str='goog le';
alert(box.test(str));
\b // 是否 边界
var box =/google\b/; // 检查字符串中的google是否在字符串的末尾(测试google必须在末尾才能匹配成功)
var str='oogledfsdfegoogle';
| // 或 匹配模式 (推荐在使用|的时候请让()包括起来,不然会出现很多奇怪的错误)
var box =/(google|baidu|bing)/; // 字符串中包含有3个其中一个 即可匹配
var str='this is google';
() // 分组
var box =/(google){4,8}/; // 意思是google这个关键词必须有4到8个之间,包含4和8
var str='googlegooglegooglegoogle';
var str='googlegooglegooglegooglegooglegooglegooglegoogle';
$1 $2 // 获取到匹配的 内容
var box =/8(.*)8/; //意思就是在(.*)位置上可以是任意的0个或者1个或者是多个字符
var str='this is a 8google8';
box.test(str); //必须要执行一下 exec()也可以
alert(RegExp.$1); //获取到匹配的内容 (.*) 对应匹配到的内容是 google,这里注意必须要加上()才有效果。
$1的作用举一个例子:
var box=/8(.*)8/;
var str='this is a 8google8'
document.write(str.replace(box,'$1')); //这里的效果自己尝试的去改8和8之间的字符串就知道了
var box=/8(.*)8(.*)/;
$1 代表 第一个(.*)
$2 代表 第二个(.*)
贪婪(什么都是我的) 惰性(节制一点)
上图告诉我们什么符号拥有贪婪属性
例子:
var box=/[a-z]/;
var str='adsfsdf';
alert(str.replace(box,'1')); // 1dsfsdf
var box=/[a-z]+/; // 贪婪 模式
var str='adsfsdf';
alert(str.replace(box,'1')); // 1
var box=/[a-z]+?/; // 惰性 模式
var str='adsfsdf';
alert(str.replace(box,'1')); // 1dsfsdf
var box=/[a-z]+?/g; // 惰性 模式 开启全局
var str='adsfsdf';
alert(str.replace(box,'1')); // 1111111
贪婪与惰性经典例子
var box=/8(.*)8/;
var str ='8google8 8google8 8google8'; //正则匹配到的是对应字符串第一个8和最后一个8,(.*) 匹配到的是google8 8google8 8google
alert(str.replace(box,'$1')); //结果是 google8 8google8 8google
var box=/8(.*?)8/g;
var str ='8google8 8google8 8google8';
alert(str.replace(box,'$1')); //结果是 google google google
/*使用exec返回数组*/
例子1:
var pattern = /^[a-z]+\s[0-9]{4}$/; //意思就是从头开始匹配的同时又要兼顾从尾部开始匹配,其中可以匹配到a到z其中一个或者多个直到遇见空格继续匹配0到9任意4个数字
var str = 'google 2012';
alert(pattern.exec(str)); // google 2012
例子2:
var pattern = /^([a-z]+)\s([0-9]{4})$/;
var str = 'google 2012';
alert(pattern.exec(str)); // google 2012,google,2012 跟之前相比多了google,2012那是有分组符号([a-z]+) ([0-9]{4})
例子3:
var pattern = /(\d+)([a-z])/; //这个叫做捕获性分组,所有的分组都捕获返回
var str = '123abc';
var a = pattern.exec(str); // 123a,123,a 先匹配整体123a,在匹配(\d+)也就是123,其次就是([a-z])就是a
//a[0]返回123a
//a[1]返回123
//a[2]返回a
例子4:
var pattern = /(\d+)(?:[a-z])/; //非捕获性分组,只要在不需要捕获返回的分组加上?:
var str = '123abc';
alert(pattern.exec(str)); // 123a,123
例子5:(容易混乱不推荐用)
var pattern = /(a?(b?(c?)))/; //嵌套分组,从外往内获取
var str = 'abc';
alert(pattern.exec(str));
//第一步:a[0],整个匹配到的字符串abc
//第二步:a[1],匹配第一个分组(a?(b?(c?))), abc
//第三步:a[2],匹配第二个分组(b?(c?), bc
//第三步:a[3],匹配第三个分组(c?), c
例子6:
?= 的用法
var pattern = /goo/;
var str = 'google';
alert(pattern.exec(str)); //返回的是goo
var pattern = /goo/;
var str = 'goobbb';
alert(pattern.exec(str)); //返回的也是goo
但是我们需要规定返回的goo的后面必须gle才能返回goo
var pattern = /goo(?=gle)/; //goo关键词后面必须是gle
var str = 'google'; //这里goo能匹配对上了,但是后面必须紧接的是gle
alert(pattern.exec(str)); //goo 如果把google改成goofff或者其他的就不能匹配了
与子相反有 ?! 用法直接例子
var box=/Windows(?!95|98|NT|2000)/ig;
var str='WindowsNt'; // 意思就是字符串 Windows 后面可以什么都不加,就算加,紧接的不能是Windows95 Windows98 WindowsNT Windows2000,其他的都行。
alert( box.exec(str) );
例子7:
var pattern = /\[/; //用\符号来转义正则里的特殊字符,才能匹配
var str = '[';
alert(pattern.test(str));
例子8:
m模式的例子
var pattern = /^\d+/gm; //限定了首匹配,并且开启换行模式
var str = '1.baidu\n2.google\n3.bing'; //这里的字符串加了\n换行,如果正则不开启换行模式m,就不能匹配到的即使是开启了g模式
alert(str.replace(pattern, '#'));
常用正则实例讲解
var pattern = /[1-9][0-9]{5}/; //共6 位数字,第一位不能为0
var str = '224000';
alert(pattern.test(str));
var pattern = /[\w]+\.(zip|rar|gz)/; //\d\w_表示所有数字和字母加下划线
var str = '123.zip'; //\.表示匹配.,后面是一个选择
alert(pattern.test(str));
var pattern = /\s/g; //g 必须全局,才能全部匹配
var str = '111 222 333';
var result = str.replace(pattern,''); //把空格匹配成无空格
alert(result);
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') + '|'); //使用了分组获取
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));
这个需要经常使用才能够灵活运用
RegExp("(^|\\s+)" + 样式名称 + "(\\s+|$)","g");