Skip to content

Latest commit

 

History

History
157 lines (118 loc) · 6.76 KB

常用正则表达式.md

File metadata and controls

157 lines (118 loc) · 6.76 KB

什么是正则表达式?

简单来讲,正则表达式就是一种可以用来操作字符串的逻辑规则,或者称之为一种字符串的匹配模式。它是一套强大的字符串匹配工具。

正则表达式可以用来做什么?

  1. 验证给定的字符串是否与正则表达式相匹配,例如身份证校验、邮箱校验、手机校验等等;
  2. 可以通过正则表达式,从字符串中获取我们想要的字符片断,例如从一串杂乱的字符里分离出数字。

正则表达式的特点

  1. 灵活性、逻辑性和功能性非常的强;
  2. 可以迅速地用极简单的方式达到字符串的复杂控制。
  3. 书写方式比较晦涩难懂。

如何学习正则表达式?

笔者比较推崇的方式是learning by doing,因此这篇文章里会出现较多的实例,读者照者文章里的例子敲一遍代码,就可以对正则表达式有基本的掌握了。

相关字符串操作函数

  1. search
  2. match
  3. replace
  4. test 在下面的例程中,会出现以上四个函数,具体的用法,请读者先自行了解。

初识正则表达式

假设我们有一个字符串abcdef,我们希望找到b这个字符在字符串中的位置,使用正则表达式来实现有两种写法,一种是JS风格的,一种是Perl风格的。

1. JS风格的写法

var str='abcdef';
var re=new RegExp('b', 'i');
alert(str.search(re));

输出的结果是:1,说明已经正则表达式已匹配到了b这个字符。代码中出现的RegExp对象代表的是正则表达式,其中第一个参数代表匹配规则,而第二个参数i代表的是忽略大小写。

2.Perl风格的写法

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

过滤html标签

{占位}

元字符

元字符简单应用

元字符组合应用

校验邮箱

校验电话号码

##常用正则表达式

验证是否为空

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;
}