《javascript高级程序设计》学习笔记,九:正则表达式

正则表达式的用法十分复杂,完全可以用一本书来讲述。这里只记录一些简单的常用的用法。

1.js里面通过RegExp类来实现正则表达式的。

var reCat = new RegExp("cat"); //匹配串中第一个"cat"

var reCat = new RegExp("cat","g"); //匹配串中所有的"cat","g"是global的意思

var reCat = new RegExp("cat","gi"); //匹配串中所有的"cat",不区分大消息,"i"是insensitive的缩写

var reCat = /cat/gi; //perl风格

2.RegExp的方法

(1)test() 判断是否匹配,返回 true 或者 false

var sTomatch ="cat";

var reCat = /cat/;

alert(reCat.test(sTomatch));//outputs true

(2)exec() 返回一个数组,数组中的第一个条目是第一个匹配

var sTomatch = "a bat, a Cat, a fAt baT, a faT cat";

var reAt = /at/;

var arrMatches = reAt.exec(sTomatch);

alert(arrMatches.toString()); //outputs 'at'

3.String对象对正则表达式的支持

(1)match()方法

var sTomatch = "a bat, a Cat, a fAt baT, a faT cat";

var reAt = /at/gi;

var arrMatches = sTomatch.match(reAt);

alert(arrMatches.toString()); //outputs 'at,at, At ,aT ,aT ,at';

(2)replace()方法

var sToChange = "this red paper is not very red";

alert(sToChange.replace("red","blue"));//只替换第一个"red",outputs "this blue paper is not very red"

要想全部替换,如下

var sToChange = "this red paper is not very red";

var reRed = /red/gi;

alert(sToChange.replace(reRed,"blue"));

(3)split()方法

var sColor = "red,blue,yellow,green";

var reCom = /\,/ ; //因为","是正则表达式的元字符,所以用"\"来转义

var arrColors = sColor.split(reCom);

上面方法的效果等同于

var sColor = "red,blue,yellow,green";

var arrColors = sColor.split(",");

4.简单模式

(1)元字符。

正则表达式的所有元字符如下:

( [ { \ ^ $ | ) ? * + .

任何正则表达式要使用元字符,都必须转义:

var reTest = /\?/ ;

或者:

var reTest = new RegExp("\\?"); //注意:是两个反斜杠,为了避免js像处理 \n 一样处理 \? ,必须双重转义。

如果删除字符串中的所有换行符,如下:

var sNewStr = sOldStr.replace(/\n/g,"");

(2)字符类:

<1>.简单类 使用[abc] ,表示匹配中括号内的字符

var reTest = /[abc]at/gi; //匹配串中'at'字符前是'a'或者'b'或者'c'

例如:

var sTomatch = "a bat, a Cat, a fAt baT, a faT cat";

var reAt = /[abc]at/gi;

var arrMatches = sTomatch.match(reAt);

alert(arrMatches); //outputs 'bat, Cat, baT, cat';

<2>.负向类 使用[^abc],表示不匹配中括号内的字符

var reTest = /[abc]at/gi; //匹配串中'at'字符前不是'a'不是'b'不是'c'

例如:

var sTomatch = "a bat, a Cat, a fAt baT, a faT cat";

var reAt = /[^abc]at/gi;

var arrMatches = sTomatch.match(reAt);

alert(arrMatches); //outputs 'fAt,faT';

<3>.范围类 [a-z] ,表示匹配a到z范围之间的

例如:

var sTomatch = "num1,num2,num3,num4,num5";

var reAt = /num[1-3]/g;

var arrMatches = sTomatch.match(reAt);

alert(arrMatches); //outputs 'num1,num2,num3';

<4>.组合类 [a-z1-4\n] 标识匹配所有a~z,1~4 以及一个换行符

例如:

var sTomatch = "num1,numanuma,numb,num4,num5,num?num3numt,num9";

var reAt = /num[1-3a-m\n]/g;

var arrMatches = sTomatch.match(reAt);

alert(arrMatches); //outputs 'num1,numa,numa,numb,num?,num3';

<5>.预定义类 由于经常用到一些模式,正则表达式预定义了一些常用匹配:如下:

代码等同于匹配
.[^\n\r]除了换行和回车之外的任意字符
\d[0-9]数字
\D[^0-9]非数字
\s[ \r\n\x0B\f\r]空白字符
\S[^\r\n\x0B\f\r]非空白字符
\w[a-zA-Z_0-9]单词字符(所有的字母、数字、下划线)
\W[^a-zA-Z_0-9]非单词字符

<6>.简单量词,如下表:

代码描述
出现零次或一次
*出现零次或多次(任意次)
+出现一次或多次(至少出现一次)
{n}一定出现n次
{n,m}至少出现n次,但不超过m次
{n,}至少出现n次

例如,想匹配单词bread,red或read:

var reB = /b?rea?d/;