javascript-第十章-正则表达式

第十章-正则表达式

正则表达式(regular expression)是一个描述字符模式的对象。javascript的RegExp类表示正则表达式。而String和RegExp都定义了使用正则表达式进行强大的模式匹配和文本检索与替换的函数。

1. 正则表达式的定义

在javascript中,正则表达式由RegExp对象表示,当然可以使用RegExp()构造函数创建RegExp对象,不过通常用直接量语法来创建RegExp对象。被定义在一堆斜杠之间的字符,例如:

1
var pattern = /s$/; //匹配所有以字母‘s’结尾的字符串

也可用构造函数表示:

1
var pattern = new RegExp('s$');

1.1 直接量字符

正则表达式的直接量字符

字符 匹配
字母数字字符 匹配自己本身
\o NUL字符(\u0000)
\t 制表符
\n 换行符
\v 垂直制表符
\v 换页符
\r 回车
\xnn 由十六进制数nn指定的拉丁字符
\uxxxx 由十六进制xxxx指定的unicode字符
\cX 控制字符^X

在正则中,许多标点符号具有特殊的含义:
^ $ . * + ? = ! : | \ / () [] {}

1.2 字符类

正则表达式的字符类

字符 匹配
[…] 位于括号之内的任意字符
[^…] 不在括号之中的任意字符
. 除换行符和其他unicode行终止符之外的任意字符
\w 任何ASCLL单字字符,等价于[a-zA-Z0-9]
\W 任何ASCLL非单字字符,等价 [^a-zA-Z0-9]
\s 任何unicode空白符
\S 任何非unicode空白符
\d 任何ASCLL数字,等价于[0-9]
\D 任何ASCLL数字之外的任何字符,等价于[^0-9]
[\b] 退格直接量

1.3 重复

正则表达式的重复字符

字符 含义
{n,m} 匹配前一项至少n次,但是不能超过m次
{n,} 匹配前一项n次或更多次
{n} 匹配前一项正好n次
? 匹配前一项0次或1次,等价于{0,1}
+ 匹配前一项一次或多次,等价于{1,}
* 匹配前一项0次或多次,等价于{0,}

1.4 选择/分组和引用

字符“|”用于分隔供选择的字符,例如,/ab|cd|ef/既匹配字符串”ab”,又匹配”cd”,又或者是”ef”. 选择项从左到右考虑,直到发现了匹配项,如果左边选项匹配,就忽略右边的匹配项。

1.5指定匹配的位置

字符 含义
^ 匹配字符串的开头
$ 匹配字符串的结尾
\b 匹配一个词语的边界
\B 匹配非词语边界的字符

1.6标志

字符 含义
i 执行大小写不敏感的匹配
g 执行全局匹配
m 多行模式

2. 用于匹配模式的String方法

类String支持四种利用正则表达式的方法

  • search(),该方法以正则表达式为参数,返回第一个与之匹配的子串的开始字符的位置,没有没有匹配子串,返回-1,例如:
1
“JavaScript”.search(/script/i); //4

如果参数不是正则表达式,会传递给RegExp构造函数转换成正则表达式。search不支持全局检索。

  • 方法replace()执行检索和替换操作,第一个参数是正则表达式,第二个参数是要进行替换的字符串。如果正则表达式中设置类标记g,将用替换字符串替换被检索的字符串中所有与模式匹配的子串,否则只替换第一个与模式匹配的子串。如果第一个参数是字符串,则直接检索该字符串。例如:

    1
    text.replace(/javascript/gi,”JavaScript”);

    第二个参数可以是函数,能够动态地计算替换字符串。

  • 方法match(),唯一的参数就是正则表达式(或者参数传递给构造函数RegExp以转换成正则表达式),返回包含匹配结果的数组,例如:

    1
    1 plus 2 equals 3”.match(/\d+/g); //[“1”,”2”,”3”]

    如果不设置标志g,只检索第一个匹配,返回的也是数组

  • split()方法可以把调用它的字符串分解为一个子串数组,使用分隔符作为参数,例如:

    1
    123,456,789”.split(‘,’); //[“123”,”456”,”789”]

    也可以用正则表达式为参数,指定分隔符,允许两个有任意多个空白符:

    1
    1,2, 3 , 4 ,5”.split(/\s*,\s*/); //[“1”,”2”,”3”,”4”,”5”]

    3. RegExp对象

构造函数RegExp()有一个或2个字符串参数,第一个是包含正则表达式主体的字符串,即正则表达式斜杠之间的文本,用\\代表转义的\字符,第二个参数可选,是表达式的标志,“g”,”i”,”m”或它们的组合,例如:

1
var zipcode = new RegExp(“\\d{5}”,”g”);//找到字符串中5个数字

3.1 用于模式匹配的RegExp方法

RegExp对象定义类2个用于执行模式匹配操作的方法。

  • exec()对一个指定的字符串执行正则表达式,就是在一个字符串中检索匹配,如果没有找到就返回null,如果找到一个匹配就返回一个数组。这个数组的元素0包含的是正则表达式相匹配的字符串,余下的所有元素包含的是与括号扩起来的子表达式相匹配的子串。而且,属性index包含类匹配发生的字符的位置,属性input引用的是被检索的字符串。

  • test()参数是一个字符串,如果这个字符串包含正则表达式的一个匹配就返回true

3.2 RegExp的实例属性

每个RegExp对象都有5个属性.

  • 属性source是一个只读字符串,存放的是正则表达式的文本。
  • 属性global是一个只读的布尔值,说明该表达式是否有标志g。
  • 属性ignoreCase是一个只读的布尔值,说明该表达式是否有标志i。
  • 属性multiline是一个只读的布尔值,说明该表达式是否有标志m。
  • 最后一个属性是lastIndex,可读写的整数。