Javascript正则表达式教程(转)

基础知识

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

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

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

  正则表达式工具

  当你的正则表达式不能正常工作的时候(无论是他应该工作还是你觉得他应该工作),你真想把头发都扯掉。这个工具很有意思RegExr Desktop app,不光可以实时的检测,还有一个侧栏,提供一些常用符号的解释。

  正则表达式 test()方法

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

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

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

  正则表达式 split()方法

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

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

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

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

  正则表达式 replace()方法

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

  示例1

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

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

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

  示例2

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

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

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

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

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

  正则表达式 match()方法

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

  示例1

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

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

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

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

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

  示例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的索引值,那么就会输出相对应的单词。

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地址

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

var email = '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。

posted @ 2011-03-17 10:47  郑文亮  阅读(223)  评论(0编辑  收藏  举报