学好正则表达式子的关键一步就是花一点时间记住这些符号。这是最好的建议了。坐下来,好好记一记,很快的:
- .:会匹配任何字符,在dotall模式为false的时候不会匹配换行符。
- *:匹配0个或者多个上面的那个字符可以匹配的
- +:匹配一个或者多个上面那个字符可以匹配的
- ?:上述可匹配字符可选,0个或1个
- \d:匹配一个数字
- \w:匹配任何字符(字母数字和下划线)
- [xyz]:匹配xyz中的一个
- [xyz]+:匹配xyz中的一个或者多个
- $:匹配行尾
- ^:匹配行首
- [^a-z]:当^在字符集里面的时候,表示不匹配,这个就表示匹配除了小写字母以外的字符
恩,这个很枯燥,但是还是得记住,必须的。
正则表达式工具
当你的正则表达式不能正常工作的时候(无论是他应该工作还是你觉得他应该工作),你真想把头发都扯掉。这个工具很有意思RegExr Desktop app,不光可以实时的检测,还有一个侧栏,提供一些常用符号的解释。
正则表达式 test()方法
这个方法接受一个字符串的参数,然后返回一个bool值来表明是否匹配。如果你不需要对匹配结果做特殊的处理–比如验证用户名–那么test()方法就够用了。
alert(/[a-zA-Z_-]+/.test(username)); //return true;
上面的例子我们声明的正则表达式用来匹配大小写字母以及_和-。我们用方括号将这个包起来,表示要匹配的字符集。后面的’+'号表示匹配字符集中的一个或者多个,然后通过test()方法来检测,因为我们的用户名johnsmith符合规则,所以返回为true。
正则表达式 split()方法
你可能比较熟悉split()方法了。他接受一个正则表达式的参数,用来确定在哪里进行分割,当然用字符串做参数也可以。
alert(str.split(/\s/)); //alerts "this,is,my,string"
传入\s表示要匹配空格,我们将字符串分割为一个数组,如果你要访问某一个,那么可以明确指出:
alert(str.spli(/\s/)[3]); //alerts string
正则表达式 replace()方法
跟你认为的一样,replace()方法就是去替换一段文本的,替换的参数可以是字符串也可以是正则表达式。
示例1
如果你想把’hello world’替换为’hello universe’,那么可以这样做:
str = str.replace(/World/,'Universe');
alert(str);
你可能会问,为什么不直接使用.replace()方法呢,因为这个方法不会复写本来的变量,所以需要重新赋值一下。
示例2
另外一个例子,想象这样的场景,为了安全起见,我们需要对用户输入的内容进行转义,比如我们需要移除那些符号,引号,分号等等。这样使用正则就很方便了。
username = username.replace(/[^A-Za-z\d_-]+/, '');
alert(username); // JohnSmith;@%
根据最后alert的内容,有人可能认为我们的代码有问题。其实不是的,J后面的那个分号还是被移除了,如果需要移除字符串中的所有符号,我们需要在最后的/后面加一个g参数。
username = username.replace(/[^A-Za-z\d_-]+/g, '');
alert(username); // JohnSmith
经过这样的处理之后,就去掉了多余的字符了,注意方括号里面的那个^符号,他表示非。真个正则表达式的意思就是匹配所有A-Z、a-z、以及-和下划线_之外的字符,然后将他们替换为空。
正则表达式 match()方法
与test()方法不同的是,match()会返回一个匹配到的字符串的数组。
示例1
alert(name.match(/e/)); //alerts "e"
我们注意到,这个字符串中有两个e,但是最后只是alert出来一个,因为缺少了g参数,我们加上之后看看。
alert(name.match(/e/g)); //alerts "e,e"
如果我们想alert某一个具体的,那么可以:
alert(name.match(/e/g)[1]); //alerts "e"
示例2
我们来看看另外一个例子来加深一下理解。
alert(string.match(/[a-z]+/gi)); // alerts "This,is,just,a,string,with,some,and,some,mixed,in"
在这个例子中,我们的正则表达式要匹配的是所有的字母,i参数表示忽略大小写,g参数表示全局查找。所以最后alert的就是字符串中所有的单词。如果我们输入要alert的索引值,那么就会输出相对应的单词。
var matches = string.match(/[a-z]+/gi);
alert(matches[2]); // alerts "just"
分割email地址
为了练习一下,我们来尝试分割一个email地址—rocker@rockux.com—来取出用户名rocker和本站地址rockux.com。
alert(email.replace(/([a-z\d_-]+)@([a-z\d_-]+)\.[a-z]{2,4}/ig, '$1, $2')); // alerts "rocker, rockux";
如果你之前对于正则表达式不是很熟悉,那么这个看着可能有点恐怖,不过没关系,我们一点一点来分解。
.replace(/[a-z\d_-]+)
从中间开始,我们去匹配所有的字母数字下划线和-,然后使用+号来匹配多个,我们需要访问这个值,所以用括号括起来。这样我们在后面就可以引用到。
@([a-z\d-_]+)
然后去匹配@字符,以及他后面的字母数字下划线和-,同样的,我们用括号括起来,一会要访问他。
\.[a-z]{2,4}/ig
这一段表示用来匹配后面的域名类型,ig表示全局匹配并且忽略大小写。在大括号中的数字表示需要匹配的前面字符的起始和结束个数。
‘$1,$2′)
这一部分表示replace方法的第二个参数,用来输入需要替换成为的字符。这里我们使用正则表达式中存储的变量,在这个例子中,$1表示rocker $2表示rockux。