这里分享一个正则表达式测试工具,学习的同时自己可以动手敲一敲。
正则表达式测试工具
小栗子
从W3C上,很容易学习到RrgExp对象的使用。
简单的举个小栗子。其实就是那个测试工具的简易版。
var str='this is a string to test my regexp';
var re='s';
regexpFun(str,re);
function regexpFun(str,reg){
var reg=new RegExp(reg,'g');
var arrs=[];
var lastidx=-1;
while(lastidx!=0){
var arr=[];
var a=reg.exec(str);
if (reg.lastIndex != 0)
{
arr[0]=a.toString();
arr[1]=a.index;//当前目标字符的位置下标
arrs.push(arr);
}
lastidx=reg.lastIndex;//下一个匹配位置,RegExp参数不设置g,是无效的
}
console.table(arrs);
}
ok,让我们躁起来!
语法
匹配纯文本
/目标字符/
匹配任意字符(包含关键字符)
就是一个英文的句点,注意,在字符集合区间里这个点就只是普通字符,在字符集合区间外面时如果要匹配点本身需要转译\.
字符集合区间
以匹配不区分大小写的字符位例,我们可以利用字符集合区间[ ]去匹配
比如[sS]将匹配s或S,最终的结果就感觉不会区分大小写。
过滤匹配
就是利用字符集合区间
执行一次[0-9a-zA-Z]将匹配到一个数字或小写字母或一个大写字母
\d ==[0-9]任何一个数字
\w==[a-zA-Z_]任何一个数字、字母、下划线
\s==[\f\n\r\t\v]任何一个空白字符
取非匹配
就是在字符集合区间的正则表达式前面加^
符,意味,除了这个字符集合区间能匹配到的其他字符都符合匹配要求
\D ==[^0-9]任何一个不是数字的字符
\W==[^a-zA-Z_]任何一个不是数字、字母、下划线的字符
\S==[^\f\n\r\t\v]任何一个不是空白字符的字符
重复匹配
当我们需要匹配的目标字符有很多重复字符时
如test@test.test
\w\w\w\w@\w\w\w\w.\w\w\w\w
很麻烦很复杂很丑,这时候可采用多个匹配
+:匹配一个或多个
*:匹配0个或多个
?:匹配0个或一个
\w+@\w+.\w+
但*+?的匹配次数太单一
那就用{ }设置重复匹配次数
如testtesttest@tes.testtest
@\w{3}
将只会匹配到@tes
重复匹配次数还可以设置匹配区间{sub,sup}
如@testtesttest@tes.@test@test
@\w{3,5}
避免过度匹配
*和+属于贪婪型
什么是贪婪型呢,就是他会尽可能匹配更多字符
比如:<b>hahah</b><b>zxzxzx</b>
我们想匹配一对标签
<b>.*</b>
没问题吧
可是,事实上他会从第一个<b>
一直匹配到最后一个</b>
<b>hahah</b><b>zxzxzx</b>
现在我们就使用懒惰型,就在我们的贪婪型后面加上?就变成了流动性
<b>.*?</b>
位置匹配 边界限定
有时候我们对匹配字符的位置有要求
比如:this is a baby-gril
我们想匹配be动词,is,但是文中有两个is
这时候我们可以采用边界限定
\bis\b
\b是匹配单词边界
\B则不会匹配单词边界
比如以下要匹配baby,gril中间的连字符
this is a baby - gril
\b-\b是匹配不到的,而\B可以
子表达式
如果我们需要整体匹配
比如abc;abbbbbbbbbbbc;abc;abc;abbbbbbbbbbbc;abc;abc;abc;abc;abc;
我要全部匹配···abc;
就可以使用子表达式()
子表达式将被包裹的正则表达式作为一个整体去匹配
(abc;)+