[转]javascript正则表达式教程

正则表达式很可怕很可怕,但是,一旦你记住并且明白了这些符号的意义,那么这些恐惧就会马上消失。如果你现在心中还有那份恐惧感,那就赶紧往下看吧。

基础知识

学好正则表达式子的关键一步就是花一点时间记住这些符号。这是最好的建议了。坐下来,好好记一记,很快的:

  • .:会匹配任何字符,在dotall模式为false的时候不会匹配换行符。
  • *:匹配0个或者多个上面的那个字符可以匹配的
  • +:匹配一个或者多个上面那个字符可以匹配的
  • ?:上述可匹配字符可选,0个或1个
  • \d:匹配一个数字
  • \w:匹配任何字符(字母数字和下划线)
  • [xyz]:匹配xyz中的一个
  • [xyz]+:匹配xyz中的一个或者多个
  • $:匹配行尾
  • ^:匹配行首
  • [^a-z]:当^在字符集里面的时候,表示不匹配,这个就表示匹配除了小写字母以外的字符

恩,这个很枯燥,但是还是得记住,必须的。

正则表达式 test()方法

这个方法接受一个字符串的参数,然后返回一个bool值来表明是否匹配。如果你不需要对匹配结果做特殊的处理-比如验证用户名-那么test()方法就够用了。

1
2
var username = 'johnsmith';
alert(/[a-zA-Z_-]+/.test(username)); //return true;

上面的例子我们声明的正则表达式用来匹配大小写字母以及_-。我们用方括号将这个包起来,表示要匹配的字符集。后面的+号表示匹配字符集中的一个或者多个,然后通过test()方法来检测,因为我们的用户名johnsmith符合规则,所以返回为true。

正则表达式 split()方法

你可能比较熟悉split()方法了。他接受一个正则表达式的参数,用来确定在哪里进行分割,当然用字符串做参数也可以。

1
2
var str = 'this is my string';
alert(str.split(/\s/)); //alerts "this,is,my,string"

传入\s表示要匹配空格,我们将字符串分割为一个数组,如果你要访问某一个,那么可以明确指出:

1
2
var str = 'this is my string';
alert(str.spli(/\s/)[3]); //alerts string

正则表达式 replace()方法

跟你认为的一样,replace()方法就是去替换一段文本的,替换的参数可以是字符串也可以是正则表达式。

示例1

如果你想把’hello world’替换为’hello universe’,那么可以这样做:

1
2
3
var str = 'Hello,World!';
str = str.replace(/World/,'Universe');
alert(str);

你可能会问,为什么不直接使用.replace()方法呢,因为这个方法不会复写本来的变量,所以需要重新赋值一下。

示例2

另外一个例子,想象这样的场景,为了安全起见,我们需要对用户输入的内容进行转义,比如我们需要移除那些符号,引号,分号等等。这样使用正则就很方便了。

1
2
3
var username = 'J;ohnSmith;@%';
username = username.replace(/[^A-Za-z\d_-]+/, '');
alert(username); // JohnSmith;@%

根据最后alert的内容,有人可能认为我们的代码有问题。其实不是的,J后面的那个分号还是被移除了,如果需要移除字符串中的所有符号,我们需要在最后的/后面加一个g参数。

1
2
3
var username = 'J;ohnSmith;@%';
username = username.replace(/[^A-Za-z\d_-]+/g, '');
alert(username); // JohnSmith

经过这样的处理之后,就去掉了多余的字符了,注意方括号里面的那个^符号,他表示非。真个正则表达式的意思就是匹配所有A-Z、a-z、以及-和下划线_之外的字符,然后将他们替换为空。

正则表达式 match()方法

与test()方法不同的是,match()会返回一个匹配到的字符串的数组。

示例1

1
2
var name = 'JeffreyWay';
alert(name.match(/e/)); //alerts "e"

我们注意到,这个字符串中有两个e,但是最后只是alert出来一个,因为缺少了g参数,我们加上之后看看。

1
2
var name = 'JeffreyWay';
alert(name.match(/e/g)); //alerts "e,e"

如果我们想alert某一个具体的,那么可以:

1
2
var name = 'JeffreyWay';
alert(name.match(/e/g)[1]); //alerts "e"

示例2

我们来看看另外一个例子来加深一下理解。

1
2
var string = 'This is just a string with some 12345 and some !@#$ mixed in.';
alert(string.match(/[a-z]+/gi)); // alerts "This,is,just,a,string,with,some,and,some,mixed,in"

在这个例子中,我们的正则表达式要匹配的是所有的字母,i参数表示忽略大小写,g参数表示全局查找。所以最后alert的就是字符串中所有的单词。如果我们输入要alert的索引值,那么就会输出相对应的单词。

1
2
3
var string = 'This is just a string with some 12345 and some !@#$ mixed in.';
var matches = string.match(/[a-z]+/gi);
alert(matches[2]); // alerts "just"

小练习

为了练习一下,我们来尝试分割一个email地址―rocker@rockux.com―来取出用户名rocker和本站地址rockux.com。

1
2
var email = 'rocker@rockux.com';
alert(email.replace(/([a-z\d_-]+)@([a-z\d_-]+)\.[a-z]{2,4}/ig, '$1, $2')

如果你之前对于正则表达式不是很熟悉,那么这个看着可能有点恐怖,不过没关系,我们一点一点来分解。

.replace(/[a-z\d_-]+)

从中间开始,我们去匹配所有的字母数字下划线和-,然后使用+号来匹配多个,我们需要访问这个值,所以用括号括起来。这样我们在后面就可以引用到。

@([a-z\d-_]+)

然后去匹配@字符,以及他后面的字母数字下划线和-,同样的,我们用括号括起来,一会要访问他。

.[a-z]{2,4}/ig

这一段表示用来匹配后面的域名类型,ig表示全局匹配并且忽略大小写。在大括号中的数字表示需要匹配的前面字符的起始和结束个数。

‘$1,$2′)

这一部分表示replace方法的第二个参数,用来输入需要替换成为的字符。这里我们使用正则表达式中存储的变量,在这个例子中,$1表示rocker $2表示rockux。