元字符
^: 串的开始
$:串的结束
*:零到多次匹配
+ :一道多次匹配
?:零或一次匹配
\b :单词边界
转义字符
\r:匹配回车
\n:匹配换行
\t:制表符
\X# :匹配十六进制数
\cX :匹配控制字符
范围及重复
我们经常会遇到描述一个范围的例子,比如,从0到3的数字,所有的英文字母,包含数字,英文字母以及下滑线等等,正则表达式规定了如何表示范围:
[...]:在集合中的任一个字符
[^...] :不在集合中的任一个字符
. :除\n之外的任一个字符
\w :所有的单字,包括字母,数字及下划线
\W :不包括所有的单字,\w的补集
\s:所有的空白字符,包括空格,制表符
\S:所有的非空白字符
\d :所有的数字
\D:所有的非数字
\b:退格字符
简化版匹配Email的正则表达式(js版)
var emailval = /^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/;
emailval.test('kmustlinux@hotmail.com');//true
emailval.test('john.abruzzi@pl.kunming.china');//true
emailval.test('@invalid.com');//false,不合法
分析:
[\w-]表示所有的字符,数字,下划线及减号
[\w-]+表示这个集合最少重复一次
(\.[\w-]+)括号表示一个分组
(\.[\w-]+)*表示这个分组出现0次或多次
@符号之后的部分与前半部分唯一不同的是,后边的一个分组的修饰符为(+),表示至少重复一次,那就意味着后半部分至少会有一个点号(.),而且点号之后至少有一个字符。这个修饰主要是用来限制输入串中必须包含域名。
脱字符(^)和美元符号($)表示以……开始,且以……结束
脱字符(^)和美元符号($)的运用小例子
var variable1 = /[a-zA-Z_][a-zA-Z0-9_]*/;
var variable2 = /^[a-zA-Z_][a-zA-Z0-9_]*$/;
console.info(variable1.test('@main'));//true
console.info(variable2.test('@main'));//false
分析:
对于variable1,test在查找整个串时,发现了完整匹配variable1表达式的部分(即只要字符串中有匹配的部分),因此返回true
对于variable2,加入了起始和结束匹配符,即字符串开始必须为字母下划线
重复
通过加推导(+),星推导(*),以及谓词,我们可以灵活的对范围进行重复,但是我们仍然需要一种机制来提供诸如4位数字,最多10个字符等这样的精确的重复方式。这就需要用到下表中的标记:
{n}:重复n次
{n,}:重复n或更多次
{n,m} :重复至少n次,至多m次
有了精确的重复方式,我们就可以来表达如身份证号码,电话号码这样的表达式。比如:
var pid = /^(\d{15}|\d{18})$/;//身份证
var mphone = /\d{11}/;//手机号码
var phone = /\d{3,4}-\d{7,8}/;//电话号码
mphone.test('13893939392');//true
phone.test('010-99392333');//true
phone.test('0771-3993923');//true
分组与引用
在正则表达式中,括号是一个比较特殊的操作符,它可以有三种作用,这三种都是比较常见的:
第一种情况,括号用来将子表达式标记起来,以区别于其他表达式,比如很多的命令行程序都提供帮助命令,键入h和help的意义是一样的,那么就会有这样的表达式:
h(elp)?//字符h之后的elp可有可无
第二种情况,括号用来分组,当正则表达式执行完成之后,与之匹配的文字将会按照规则填入各个分组,比如,某个数据库的主键是这样的格式:四个字符表示省份,然后是四个数字表示区号,然后是两位字符表示区县,如yunn0871cg表示云南省昆明市呈贡县,我们关心的是区号和区县的两位字符代码,怎么分离出来呢?
var pattern = /\w{4}(\d{4})(\w{2})/;
var result = pattern.exec('yunn0871cg');
console.info('city code = ' + result[1] + ',county code = ' + result[2]);
result = pattern.exec('shax0917cc');
console.info('city code = ' + result[1] + ',county code = ' + result[2]);
正则表达式的exec方法会返回一个数组(如果匹配成功的话),数组的第一个元素(下标为0)表示整个串,第一个元素为第一个分组,第二个元素为第二个分组,以此类推。
因此上例的执行结果即为:
city code = 0871,county code = cg
city code = 0971,county code = cc
String对象对正则表达式的支持。
match :匹配正则表达式,返回匹配数组。
replace:替换。原字符串不变,返回替换后的字符串。
split : 分割。
1)match
var str = "life is very much like a mirror.";
var result = str.match(/is|a/g);
console.info(result);//返回["is","a"]
2)replace
a)replace方法不会影响原始字符串,而将新的串作为返回值。
b)如果在替换过程中,需要对匹配的数组进行引用(正如之前的\1,\2方式那样),需要怎么做呢?我们可以通过
$n来对第n个分组进行引用。
var str = "<span>Welcome,John</span>";
var result = str.replace(/(\w+),\s(\w+)/g,"$2,$1");
console.info(result);
可以得到这样的结果:
<span>John,Welcome</span>