简单来讲,正则表达式就是一种可以用来操作字符串的逻辑规则,或者称之为一种字符串的匹配模式。它是一套强大的字符串匹配工具。
- 验证给定的字符串是否与正则表达式相匹配,例如身份证校验、邮箱校验、手机校验等等;
- 可以通过正则表达式,从字符串中获取我们想要的字符片断,例如从一串杂乱的字符里分离出数字。
- 灵活性、逻辑性和功能性非常的强;
- 可以迅速地用极简单的方式达到字符串的复杂控制。
- 书写方式比较晦涩难懂。
笔者比较推崇的方式是learning by doing,因此这篇文章里会出现较多的实例,读者照者文章里的例子敲一遍代码,就可以对正则表达式有基本的掌握了。
假设我们有一个字符串abcdef
,我们希望找到b
这个字符在字符串中的位置,使用正则表达式来实现有两种写法,一种是JS风格的,一种是Perl风格的。
var str='abcdef';
var re=new RegExp('b', 'i');
alert(str.search(re));
输出的结果是:1
,说明已经正则表达式已匹配到了b
这个字符。代码中出现的RegExp
对象代表的是正则表达式,其中第一个参数代表匹配规则
,而第二个参数i
代表的是忽略大小写。
var re=/b/i;
var str='abcdef';
alert(str.search(re));
Perl风格的写法与JS风格的写法其实是等价的,但更推荐Perl风格的书写方式。Perl风格的匹配规则写在了/
/
两个斜杠之间,而忽略大小写的参数i
则写在了最后一个斜杠之后。
Note:正则表达式对大小写敏感,读者也可以将参数`i`去除,然后把`str`中的b字符修改为大写B字符,看看是什么效果。
在正则中,转义字符\d
所代表的是数字。假设我们有一串字符234abc
,我们希望从该字符串中将234
分离出来。我们尝试一下这么写:
var str = '234abc';
var re = /\d/;
alert(str.match(re));
输出的结果只有2
,说明\d
只是匹配到了第一个数字。
我们再对以上的代码稍加修改如下:
var str = '234abc';
var re = /\d\d\d/;
alert(str.match(re));
这样就匹配到了234
,但是这种写法在数字很长的情况会使正则表达式变得非常地长,所以也不实用。
那么,这里我们要引出另一个概念——量词。在正则表达式中,有这么一个常用的量词+
,它所代表的意思是“若干”,下面我们结合实例来看看量词的用法:
var str = '234abc';
var re = /\d+/g;
alert(str.match(re));
在\d
之后加上+
代表的是“匹配若干个数字”的意思。那么最后的g
又是什么意思呢?最后的g
代表global
的意思,也就是全局。假如不加g
这个参数,即使你的正则是\d+
,结果也只会返回第一个匹配到的数字,因此这个参数是告诉程序在全局中去匹配数字,这是相当有用的一个参数。读者也可以修改以上代码,将g
去掉,看看效果如何。
假设现在字符串变得更复杂了str="89 @ idsf 8 7 klj ==09^08 %%&*"
,使用同样的规则,也可以很方便地将字符串中的数字分离出来:
str="89 @ idsf 8 7 klj ==09^08 %%&*"
var re = /\d+/g;
alert(str.match(re));
假设在你的网站上,用户发表中评论中存在这样的字符串1775年,卢梭为法国《百科全书》撰写了“政治经济学”条目,把政治经济学和家庭经济区分开来。
,而政治
这个词属于网站的敏感词汇,你希望把政治
替换成***
。(这里是假设,不代表我的政治立场= =)那么可以这么做:
var str = '1775年,卢梭为法国《百科全书》撰写了“政治经济学”条目,把政治经济学和家庭经济区分开来。';
var re = /政治/g;
str = str.replace(re,'***');
alert(str);
这样就把政治
两个字替换成***
了。值得注意的是,这里的正则需要加上g
的参数,这样才可以把文中出现的所有政治
都替换掉。另外,直接执行str.replace()
的操作,替换的字符并不会直接覆盖str
变量,因此需要重新赋值。
最近新广告法出炉,对很多广告词都作了限制,那么假设我们发表的文章中出现了违规的广告词,如果抓得严的话会被罚款,于是我们可以写一个小程序对这些违规的词汇进行一次检测。遭到新广告法限制的词汇会有多个,那么如果我们用正则来匹配这些关键字,并为它们加上括号进行标注的话,我们所写的正则也应该是能够匹配多个关键字的。下面我们从《新广告法》中提到的违规词汇选出三个关键词来写一段程序:
var str ="迄今为止最快的某某手机顶级双平台全球首发";//某手机品牌的广告语
var re = /最快|顶级|全球首发/g;
str = str.replace(re,function(result){
return '['+result+']';
});
参考文档:http://www.huxiu.com/group/thread/145190.html http://www.baidufe.com/item/40cb68b3270ac0a1ddc0.html https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Regular_Expressions
{占位}
##常用正则表达式
function checkNull(value) {
if(!value.replace(/^(\s|\u00A0)+|(\s|\u00A0)+$/g)) {
return false;
} else {
return true;
}
}
function isValidMobile (value) {
var isValid = !!value.match(/^(0|86|17951)?(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$/);
return isValid;
}
function isValidMail(value) {
var isValid = !!value.match(/^(?:[a-zA-Z0-9]+[_\-\+\.]?)*[a-zA-Z0-9]+@(?:([a-zA-Z0-9]+[_\-]?)*[a-zA-Z0-9]+\.)+([a-zA-Z]{2,})+$/);
return isValid;
}