正则表达式是一个描述字符模式的对象。
javascript的regexp对象和string对象定义了使用正则表达式来执行强大的模式匹配和文本检索与替换函数的方法.
在javascript中,正则表达式是由一个regexp对象表示的.当然,可以使用一个regexp()构造函数来创建regexp对象,
也可以用javascript 1.2中的新添加的一个特殊语法来创建regexp对象.就像字符串直接量被定义为包含在引号内的字符一样,
正则表达式直接量也被定义为包含在一对斜杠(/)之间的字符.所以,javascript可能会包含如下的代码:
var pattern = /s$/;
这行代码创建一个新的regexp对象,并将它赋给变量parttern.这个特殊的regexp对象和所有以字母"s"结尾的字符串都匹配.用regexp()也可以定义
一个等价的正则表达式,代码如下:
var pattern = new regexp("s$");
无论是用正则表达式直接量还是用构造函数regexp(),创建一个regexp对象都是比较容易的.较为困难的任务是用正则表达式语法来描述字符的模式.
javascript采用的是perl语言正则表达式语法的一个相当完整的子集.
正则表达式的模式规范是由一系列字符构成的.大多数字符(包括所有字母数字字符)描述的都是按照字面意思进行匹配的字符.这样说来,正则表达式/java/就和
所有包含子串 "java" 的字符串相匹配.虽然正则表达式中的其它字符不是按照字面意思进行匹配的,但它们都具有特殊的意义.正则表达式 /s$/ 包含两个字符.
第一个特殊字符 "s" 是按照字面意思与自身相匹配.第二个字符 "$" 是一个特殊字符,它所匹配的是字符串的结尾.所以正则表达式 /s$/ 匹配的就是以字母 "s" 结尾
的字符串.
1.直接量字符
我们已经发现了,在正则表达式中所有的字母字符和数字都是按照字面意思与自身相匹配的.javascript的正则表达式还通过以反斜杠(/)开头的转义序列支持某些非
字母字符.例如,序列 "/n" 在字符串中匹配的是一个直接量换行符.在正则表达式中,许多标点符号都有特殊的含义.下面是这些字符和它们的含义:
正则表达式的直接量字符
字符 匹配
________________________________
字母数字字符 自身
/ f 换页符
/ n 换行符
/ r 回车
/ t 制表符
/ v 垂直制表符
/ / 一个 / 直接量
/ / 一个 / 直接量
/ . 一个 . 直接量
/ * 一个 * 直接量
/ + 一个 + 直接量
/ ? 一个 ? 直接量
/ | 一个 | 直接量
/ ( 一个 ( 直接量
/ ) 一个 ) 直接量
/ [ 一个 [ 直接量
/ ] 一个 ] 直接量
/ { 一个 { 直接量
/ } 一个 } 直接量
/ xxx 由十进制数 xxx 指 定的ascii码字符
/ xnn 由十六进制数 nn 指定的ascii码字符
/ cx 控制字符^x. 例如, /ci等价于 /t, /cj等价于 /n
___________________________________________________
如果想在正则表达式中使用特殊的标点符号,必须在它们之前加上一个 "/" .
2.字符类
将单独的直接符放进中括号内就可以组合成字符类.一个字符类和它所包含的任何一个字符都匹配,所以正则表达式 / [abc] / 和字母 "a" , "b" , "c" 中的任何一个
都匹配.另外还可以定义否定字符类,这些类匹配的是除那些包含在中括号之内的字符外的所有字符.定义否定字符尖时,要将一个 ^ 符号作为从左中括号算起的第
一个字符.正则表达式的集合是 / [a-za-z0-9] / .
由于某些字符类非常常用,所以javascript的正则表达式语法包含一些特殊字符和转义序列来表示这些常用的类.例如, /s 匹配的是空格符,制表符和其它空白符, /s
匹配的则是空白符之外的任何字符.
正则表灰式的字符类
字符 匹配
____________________________________________________
[...] 位于括号之内的任意字符
[^...] 不在括号之中的任意字符
. 除了换行符之外的任意字符,等价于[^/n]
/w 任何单字字符, 等价于[a-za-z0-9]
/w 任何非单字字符,等价于[^a-za-z0-9]
/s 任何空白符,等价于[/ t / n / r / f / v]
/s 任何非空白符,等价于[^/ t / n / r / f / v]
/d 任何数字,等价于[0-9]
/d 除了数字之外的任何字符,等价于[^0-9]
[/b] 一个退格直接量(特例)
________________________________________________________________
3.复制
用以上的正则表式的语法,可以把两位数描述成 / / d / d /,把四位数描述成 / /d / d / d / d /.但我们还没有一种方法可以用来描述具有任意多数位的数字或者是一个
字符串.这个串由三个字符以及跟随在字母之后的一位数字构成.这些复杂的模式使用的正则表达式语法指定了该表达式中每个元素要重复出现的次数.
指定复制的字符总是出现在它们所作用的模式后面.由于某种复制类型相当常用.所以有一些特殊的字符专门用于表示它们.例如: +号匹配的就是复制前一模式一次
或多次的模式.下面的表列出了复制语法.先看一个例子:
//d{2, 4}/ //匹配2到4间的数字.
//w{3} /d?/ //匹配三个单字字符和一个任意的数字.
//s+java/s+/ //匹配字符串"java" ,并且该串前后可以有一个或多个空格.
/[^"] * / //匹配零个或多个非引号字符.
正则表达式的复制字符
字符 含义
__________________________________________________________________
{n, m} 匹配前一项至少n次,但是不能超过m次
{n, } 匹配前一项n次,或者多次
{n} 匹配前一项恰好n次
? 匹配前一项0次或1次,也就是说前一项是可选的. 等价于 {0, 1}
+ 匹配前一项1次或多次,等价于{1,}
* 匹配前一项0次或多次.等价于{0,}
___________________________________________________________________
4.选择,分组和引用
正则表达式的语法还包括指定选择项,对子表达式分组和引用前一子表达式的特殊字符.字符| 用于分隔供选择的字符.例如: /ab|cd|ef/ 匹配的是字符串 "ab",或者是
字符串 "cd",又或者 "ef". //d{3}|[a-z]{4}/ 匹配的是要么是一个三位数,要么是四个小写字母.在正则表达式中括号具有几种作用.它的主要作用是把单独的项目分组
成子表达式,以便可以像处理一个独立的单元那种用 *、+或? 来处理那些项目.例如: /java(script) ?/ 匹配的是字符串 "java",其后既可以有 "script",也可以没有. /
(ab|cd) + |ef) / 匹配的既可以是字符串 "ef",也可以是字符串"ab" 或者 "cd" 的一次或多次重复.
在正则表达式中,括号的第二个用途是在完整的模式中定义子模式。当一个正则表达式成功地和目标字符串相匹配时,可以从目标串中抽出和括号中的子模式相匹配
的部分.例如,假定我们正在检索的模式是一个或多个字母后面跟随一位或多位数字,那么我们可以使用模式 / [a-z] + / d+/.但是由于假定我们真正关心的是每个匹配
尾部的数字,那么如果我们将模式的数字部分放在括号中 (/ [a-z] + (/d+)/) ,我们就可以从所检索到的