ECMAScript
通过 RegExp
类型来支持正则表达式。
一、正则表达式的定义
- 通过字面量形式
var expression = / pattern / flags ;
// 模式(pattern)部分可以是任何简单或复杂的正则表达式;
// 标志(flags)用以标明正则表达式的行为。
正则表达式的匹配模式支持下列 3 个标志:
g
:表示全局模式,即模式将被应用于所有字符串,而非在发现第一个匹配项时立即 停止;i
:表示不区分大小写模式,即在确定匹配项时忽略模式与字符串的大小写;m
:表示多行模式,即在到达一行文本末尾时还会继续查找下一行中是否存在与模 式匹配的项。
// 匹配字符串中所有"at"的实例
var pattern1 = /at/g;
// 匹配第一个"bat"或"cat",不区分大小写
var pattern2 = /[bc]at/i;
// 匹配所有以"at"结尾的 3 个字符的组合,不区分大小写
var pattern3 = /.at/gi;
- 使用
RegExp
构造函数
RegExp
构造函数接收两个参数:一个是要匹配的字符串模式,另一个是可选的标志字符串。可以使用字面量定义的任何表达式,都可以使用构造函数来定义。
注意:传递给 RegExp
构造函数的两个参数都是字符串(不能把正则表达式字面量传递给 RegExp
构造函数)。
// 匹配第一个"bat"或"cat",不区分大小写
var pattern1 = /[bc]at/i;
// 与 pattern1 相同,只不过是使用构造函数创建的
var pattern2 = new RegExp("[bc]at", "i");
ECMAScript 5
明确规定,使用正则表达式字面量必须像直接调用 RegExp
构造函数一样,每次都创建新的 RegExp
实例。
二、RegExp
实例属性
RegExp
的每个实例都具有下列属性,通过这些属性可以取得有关模式的各种信息:
global
:布尔值,表示是否设置了 g 标志。ignoreCase
:布尔值,表示是否设置了 i 标志。lastIndex
:整数,表示开始搜索下一个匹配项的字符位置,从 0 算起。multiline
:布尔值,表示是否设置了 m 标志。source
:正则表达式的字符串表示,按照字面量形式而非传入构造函数中的字符串模式返回。
var pattern1 = /\[bc\]at/i;
alert(pattern1.global); //false
alert(pattern1.ignoreCase); //true
alert(pattern1.multiline); //false
alert(pattern1.lastIndex); //0
alert(pattern1.source); //"\[bc\]at"
三、RegExp
实例方法
exec()
方法
- 功能:用于检索字符串中的正则表达式的匹配。
- 参数:
string
,必须,要检索的字符串。- 返回值:返回一个数组,其中存放匹配的结果。如果未找到匹配,则返回值为
null
。
var text = "mom and dad and baby";
var pattern = /mom( and dad( and baby)?)?/gi;
var matches = pattern.exec(text);
// index 表示匹配 项在字符串中的位置
alert(matches.index); // 0
// input 表示应用正则表达式的字符串
alert(matches.input); // "mom and dad and baby"
// 在数组中,第一项是与整个模式匹配的字符串
alert(matches[0]); // "mom and dad and baby"
// 其他项是与模式中的捕获组匹配的字符串
alert(matches[1]); // " and dad and baby"
alert(matches[2]); // " and baby"
test()
方法
- 功能:用于检测一个字符串是否匹配某个模式,
test()
方法经常被用在if
语句中。- 参数:
string
,必须,要检索的字符串。- 返回值:
true
或者false
var text = "000-00-0000";
var pattern = /\d{3}-\d{2}-\d{4}/;
if (pattern.test(text)){
alert("The pattern was matched.");
}
注意:支持正则表达式的String
对象的方法有:search()
、match()
、replace()
和split()
。
四、正则表达式中使用的各种字符和元字符
- 直接量字符
正则表达式中的所有字母和数字都是按照字面含义进行匹配的,非字母的字符需要通过反斜杠(\)作为前缀进行转义。
正则表达式中的直接量字符:
字符 | 匹配 |
---|---|
数字和字母 | 自身 |
\0 |
NULL (\u0000 ) 字符 |
\t |
水平制表符 (\u0009 ) |
\n |
换行符(\u000A ) |
\v |
垂直制表符(\u000B ) |
\f |
换页符(\u000C ) |
\r |
回车符(\u000D ) |
\xnn |
由十六进制指定的拉丁字符,例如:\x0A 等价于\n
|
\xxxxx |
由十六进制指定的Unicode 字符,例如:\u0009 等价于\t
|
\cX |
控制字符^X ,例如:\cJ 等价于换行符\n
|
- 字符类
将直接量字符单独放进方括号内就组成了字符类,一个字符类可以匹配它所包含的任意字符。
正则表达式字符类:
字符 | 匹配 |
---|---|
[...] |
方括号内的任意字符 |
[^...] |
不在方括号内的任意字符 |
. |
除换行符和其他Unicode 行终止符之外的任意字符 |
\w |
任何ASCII 字符组成的单词,等价于[a-zA-Z0-9]
|
\W |
任何不是ASCII 字符组成的单词,等价于[^a-zA-Z0-9]
|
\s |
任何Unicode 空白符 |
\S |
任何非Unicode 空白符的字符,注意\W 和\S 不同 |
\d |
任何ASCII 数字,等价于[0-9]
|
\D |
除了ASCII 数字之外的任何字符,等价于[^0-9]
|
\b |
退格直接量(特例) |
- 重复
在正则模式之后跟随用以指定字符重复的标记,由于某些重复种类非常常用,因此有一些专门用于表示这种情况的特殊字符。
正则表达式的重复字符语法:
字符 | 含义 |
---|---|
{n,m} |
匹配前一项至少n 次,但不能超过m 次 |
{n,} |
匹配前一项n 次或者更多次 |
{n} |
匹配前一项n 次 |
? |
匹配前一项0 次或者1 次,也就是说前一项是可选的,等价于{0,1}
|
+ |
匹配前一项1 次或者多次,等价于{1,}
|
* |
匹配前一项0 次或者多次,等价于{0,}
|
/\d{2,4}/ //匹配2~4个数字
/\w{3}\d?/ //精确匹配三个单词和一个可选的数字
/\s+java\s+/ //匹配前后带有一个或多个空格的字符串"java"
/[^(]*/ //匹配一个或多个非左括号的字符
- 选择、分组和引用
正则表达式的选择、分组和引用字符:
字符 | 含义 |
---|---|
| |
选择,匹配的是该符号左边的子表达式或右边的子表达式;如果左边的选择项匹配,就忽略右边的匹配项 |
(...) |
组合,将几个项组合为一个单元,这个单元可以通过"*" 、"+" 、"?" 和"|" 等等符号加以修饰,而且可以记住和这个组合相匹配的字符串以供此后的引用使用 |
(?:...) |
只组合,把项组合到一个单元,但不记忆与该组相匹配的字符 |
\n |
和第n 个分组第一次匹配的字符串相匹配,组是圆括号中的子表达式(也有可能是嵌套的),组索引是从左到右的左括号数,"(?:"形式的分组不编码 |
- 指定匹配位置
正则表达式中的锚字符:
字符 | 含义 |
---|---|
^ |
匹配字符串的开头,在多行检索中,匹配一行的开头 |
$ |
匹配字符串的结尾,在多行检索中,匹配一行的结尾 |
\b |
匹配一个单词的边界,简而言之,就是位于字符\w 和\W 之间的位置,或位于字符\w 和字符串的开头或者结尾之间的位置 |
\B |
匹配非单词边界的位置 |
(?=p) |
零宽正向先行断言,要求接下来的字符都与p 匹配,但不能包括匹配p 的那些字符 |
(?!p) |
零宽负向先行断言,要求接下来的字符不与p 匹配 |