正则表达式
正则表达式的定义
一个RegExp对象的每一次估值都返回新对象,这意味着RegExp是可变对象。
直接量字符
模式 |
说明 |
备注 |
任意字符 |
除 ^ $ . * + ? = ! : | \ / () [] {} 以外的字符,代表自身 |
|
\0(数字零) |
NUL 字符 |
\u0000 |
\t |
制表符 |
\u0009 |
\n |
换行符 |
\u000A |
\v |
垂直制表符 |
\u000B |
\f |
换页符 |
\u000C |
\r |
回车符 |
\u000D |
\xnn |
由十六进制数nn指定的ASCII字符 |
\x20表示空格 |
\unnnn |
由十六进制数nnnn指定的Unicode字符 |
\u0020表示空格 |
\cX |
控制字符^X |
\cC是CTRL-C |
在正则表达式中,许多标点符号有特殊含义,他们是:
^ $ . * + ? = ! : | \ / () [] {}
如果想在正则表达式中使用这些字符的直接量进行匹配,则需要使用\转义前缀。但是在一定的上下文中也可以省略\转义前缀。
字符类
模式 |
说明 |
备注 |
[ . . . ] |
方括号内的任何一个字符 |
方括号内\/]需要转义,其他符号可以不转义 |
[^ . . . ] |
不在方括号中的任何一个字符 |
|
[a-z] |
连字符表示字符范围 |
连字符位于方括号的开始或结尾表示连字符本身 |
. |
除换行符(包括所有的unicode行终止符)之外的任何一个字符 |
|
\w |
一个单词字符 |
[a-zA-Z0-9] |
\W |
一个非单词字符 |
[^\w] |
\s |
任何一个unicode空白符 |
|
\S |
任何一个非unicode空白符的字符 |
|
\d |
任何一个数字字符 |
[0-9] |
\D |
任何一个非数字字符 |
[^0-9] |
[\b] |
退格直接量 |
|
[\u4E00-\u9FA5\uF900-\uFA2D]可以匹配一个汉字
数量词
贪婪 |
懒惰 |
说明 |
匹配次数(x) |
{n,m} |
{n,m}? |
匹配左侧元素至少n次,但不多于m次。 |
n <= x <= m |
{n,} |
{n,}? |
匹配左侧元素至少n次。 |
n <= x |
{n} |
|
匹配左侧元素恰好n次。 |
n == x |
? |
?? |
{0,1} |
|
+ |
+? |
{1,} |
|
* |
*? |
{0,} |
|
选择、分组和引用
序列 |
说明 |
备注 |
| |
选择,匹配的是竖线左边或右边的子表达式 |
注意需要先严后宽的顺序。(abcd|abc) |
( . . . ) |
组,将多个项组合为一个单元,并捕获匹配的字符串以备引用。 |
|
(?: . . ) |
非捕获组,将多个项项组合为一个单元,但是不捕获匹配的字符串。 |
|
\n |
后向引用,匹配第n分组匹配的字符串,n是开括号从左到右的序数。 |
|
指定匹配位置
模式 |
说明 |
模式 |
输入字符串 |
匹配 |
^ |
匹配字符串的起点,在m修饰符下匹配一行的起点 |
^\d{3} |
"901-333-" |
"901-" |
$ |
匹配字符串的终点,在m修饰符下匹配一行的终点 |
-\d{3}$ |
"-901-333" |
"-333" |
\b |
匹配单词的边界 |
\Bend\w*\b |
"end sends endure lender" |
"ends","ender" |
\B |
匹配非单词边界的位置 |
|
|
|
(?=expr) |
肯定式断言,子表达式匹配右侧文本 |
\w+(?=\.) |
"He is. The dog ran. The sun is out." |
"is","ran","out" |
(?!expr) |
否定式断言,子表达式不匹配右侧文本 |
\b(?!un)\w+\b |
"unsure sure unity used" |
"sure","used" |
修饰符
字符 |
含义 |
i |
不区分大小写 |
g |
全局匹配 |
m |
多行模式,其中^和$匹配每行的开头和末尾 |
正则表达式相关的String方法
search()
定义和用法
search() 方法用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串。
语法
stringObject.search(regexp)
参数 |
描述 |
regexp |
是需要检索的 RegExp 对象。如果该参数不是 RegExp 对象,则需要首先把它传递给 RegExp 构造函数,将其转换为 RegExp 对象。 |
返回值
stringObject 中第一个与 regexp 相匹配的子串的起始位置。如果没有找到任何匹配的子串,则返回 -1。
说明
search() 方法不执行全局匹配,它将忽略标志 g。它同时忽略 regexp 的 lastIndex 属性,并且总是从字符串的开始进行检索,这意味着它总是返回 stringObject 的第一个匹配的位置。
replace()
定义和用法
replace() 方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串。
语法
stringObject.replace(regexp/substr,replacement)
参数 |
描述 |
regexp/substr |
必需。规定子字符串或要替换的模式的 RegExp 对象。 请注意,如果该值是一个字符串,则将它作为要检索的直接量文本模式,而不是首先被转换为 RegExp 对象。 |
replacement |
必需。一个字符串值。规定了替换文本或生成替换文本的函数。 |
返回值
一个新的字符串,是用 replacement 替换了 regexp 的第一次匹配或所有匹配之后得到的。
说明
字符串 stringObject 的 replace() 方法执行的是查找并替换的操作。它将在stringObject 中查找与 regexp 相匹配的子字符串,然后用 replacement 来替换这些子串。如果 regexp 具有全局标志 g,那么 replace() 方法将替换所有匹配的子串。否则,它只替换第一个匹配子串。
replacement 可以是字符串,也可以是函数。如果它是字符串,那么每个匹配都将由字符串替换。但是 replacement 中的 $ 字符具有特定的含义。如下表所示,它说明从模式匹配得到的字符串将用于替换。
字符 |
替换文本 |
$1、$2、...、$99 |
与 regexp 中的第 1 到第 99 个子表达式相匹配的文本。 |
$& |
与 regexp 相匹配的子串。 |
$` (左撇) |
位于匹配子串左侧的文本。 |
$' (右撇) |
位于匹配子串右侧的文本。 |
$$ |
直接量符号。 |
注意:ECMAScript v3 规定,replace() 方法的参数 replacement 可以是函数而不是字符串。在这种情况下,每个匹配都调用该函数,它返回的字符串将作为替换文本使用。该函数的第一个参数是匹配模式的字符串。接下来的参数是与模式中的子表达式匹配的字符串,可以有 0 个或多个这样的参数。接下来的参数是一个整数,声明了匹配在stringObject 中出现的位置。最后一个参数是 stringObject 本身。
match()
定义和用法
match() 方法可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配。
语法
stringObject.match(regexp)
参数 |
描述 |
regexp |
必需。规定要匹配的模式的 RegExp 对象。如果该参数不是 RegExp 对象,则需要首先把它传递给 RegExp 构造函数,将其转换为 RegExp 对象。 |
返回值
存放匹配结果的数组。该数组的内容依赖于 regexp 是否具有全局标志 g。
说明
match() 方法将检索字符串 stringObject,以找到一个或多个与 regexp 匹配的文本。这个方法的行为在很大程度上有赖于 regexp 是否具有标志 g。
如果 regexp 没有标志 g,那么 match() 方法就只能在 stringObject 中执行一次匹配。如果没有找到任何匹配的文本, match() 将返回 null。否则,它将返回一个数组,其中存放了与它找到的匹配文本有关的信息。该数组的第 0 个元素存放的是匹配文本,而其余的元素存放的是与圆括号分组匹配的文本。除了这些常规的数组元素之外,返回的数组还有两个属性。index 属性指明匹配文本在 stringObject 中的位置,input 属性是对stringObject 自身的引用。
如果 regexp 具有标志 g,则 match() 方法将执行全局检索,找到 stringObject 中的所有匹配子字符串。若没有找到任何匹配的子串,则返回 null。如果找到了一个或多个匹配子串,则返回一个数组。不过它的数组元素中存放的是 stringObject 中所有的匹配子串,而且也没有 index 属性或 input 属性。注意在全局检索模式下,match() 即不提供与子表达式匹配的文本的信息,也不声明每个匹配子串的位置。如果您需要这些全局检索的信息,可以使用 RegExp.exec()。
string.split(delimiter, limit)
定义和用法
split() 方法用于把一个字符串分割成字符串数组。
语法
stringObject.split(separator,howmany)
参数 |
描述 |
separator |
字符串或正则表达式,从该参数指定的地方分割 stringObject。 |
howmany |
可选。该参数可指定返回的数组的最大长度。如果设置了该参数,返回的子串不会多于这个参数指定的数组。如果没有设置该参数,整个字符串都会被分割,不考虑它的长度。 |
返回值
一个字符串数组。该数组是通过在 separator 指定的边界处将字符串 stringObject 分割成子串创建的。
说明
如果没有指定separator,则stringObject不会被分割,返回的数组仅包含一个stringObject字符串。
如果separator为空字符串或者是匹配空字符串的正则表达式,那么 stringObject 中的每个字符之间都会被断开。
如果separator匹配stringObject字符串的开头,则返回数组的第一个元素为空字符串。同样,如果separator匹配stringObject字符串的结尾,则返回数组的最后一个元素为空字符串。
如果separator为形如/()/被圆括号括起来的正则表达式,分隔符匹配的文本将在数组中返回。否则,返回数组将不包括分割符文本。
注释:String.split() 执行的操作与 Array.join 执行的操作是相反的。
RegExp对象
source
定义和用法
source 只读属性用于返回模式文本。该文本不包括正则表达式直接量的斜杠定界符,也不包括标志 g、i、m。
语法
RegExpObject.source
global
定义和用法
global 属性表示是否设置 g 标志。
它声明了给定的正则表达式是否执行全局匹配。
如果设置了 g 标志,则该属性为 true,否则为 false。
语法
RegExpObject.global
ignoreCase
定义和用法
ignoreCase 属性表示是否设置 i 标志。
如果设置了 "i" 标志,则返回 true,否则返回 false。
语法
RegExpObject.ignoreCase
multiline
定义和用法
multiline 属性表示是否设置 m 标志。
它声明了给定的正则表达式是否以多行模式执行模式匹配。在这种模式中,如果要检索的字符串中含有换行符,^ 和 $ 锚除了匹配字符串的开头和结尾外还匹配每行的开头和结尾。
例如,模式 /W3School$/im 匹配 "w3school" 和 "W3School\nisgreat"。(\n 是换行符\u000A)。
如果 m 标志被设置,则该属性为 true,否则为 false。
语法
RegExpObject.multiline
lastIndex
定义和用法
lastIndex 属性是下次匹配的起始位置。
语法
RegExpObject.lastIndex
说明
对于带"g"修饰符的正则表达式,该属性存放一个字符位置,它紧跟 RegExp.exec() 和RegExp.test() 方法上次匹配的位置。这些方法使用 lastIndex 属性所指的位置作为下次检索的起始点。通过反复调用这两个方法就可以遍历一个字符串中的所有匹配文本。注意不带有标志"g" 和不表示全局模式的 RegExp 对象不能使用 lastIndex 属性。
lastIndex是可读可写的属性。可以随时设置它,以指定目标字符串中下一次搜索的开始位置。当方法 exec() 或 test() 再也找不到可以匹配的文本时,它们会自动把 lastIndex属性重置为 0。在成功地匹配了某个字符串之后,如果开始检索新字符串,必须显示把这个属性设置为 0。
exec()
定义和用法
exec() 方法用于检索字符串中的正则表达式的匹配。
语法
RegExpObject.exec(string)
参数 |
描述 |
string |
必需。要检索的字符串。 |
返回值
返回一个数组,其中存放匹配的结果。如果未找到匹配,则返回 null。
说明
所有RegExp和String模式匹配方法中,exec() 方法是最强大的,它是一个通用的方法,相比 RegExp.test(), String.search(), String.replace(), 和 String.match() 方法,某种程度上,使用它更为复杂。
exec()搜索string中匹配RegExpObject的文本。如果 exec() 发现一个匹配,则返回一个结果数组。否则,返回 null。结果数组的第 0 个元素是匹配文本,第 1 个元素是与RegExpObject 的第 1 个括号子表达式相匹配的文本(如果有的话),第 2 个元素是与RegExpObject 的第 2 个子表达式相匹配的文本,以此类推。这个数组的length属性表示数组的元素个数。除了数组元素和 length 属性之外,exec() 方法返回的值还有两个属性。index 属性声明的是匹配文本的开始位置。input 属性则是 string。当RegExpObject 是非全局的 RegExp 对象时,这个返回数组与方法 String.match() 返回的数组是相同的。
当 RegExpObject 是一个全局正则表达式时,exec() 的行为就稍微复杂一些。它会在RegExpObject 的 lastIndex 属性指定的字符处开始检索字符串 string。当它发现一个匹配,它设置 lastIndex 属性为匹配文本后第一个字符的位置。这就是说,可以反复调用exec() 方法来遍历字符串中的所有匹配文本。当 exec() 再也找不到匹配的文本时,它将返回 null,并把 lastIndex 属性重置为 0。在成功地匹配了字符串之后,如果开始检索新字符串,必须仔细手动重置 lastIndex 属性为 0。
注意,无论 RegExpObject 是否是全局模式,exec() 总是在返回数组中包括每次匹配的完整细节。这是 exec() 与 String.match() 的不同之处,在全局模式下后者返回的信息少得多。要想获得全局模式的完整模式匹配信息,唯一的方法是在一个循环中反复调用exec() 方法。
test()
定义和用法
test()方法用于检测一个字符串是否匹配某个模式。
语法
RegExpObject.test(string)
参数 |
描述 |
string |
必需。要检测的字符串。 |
返回值
如果字符串 string 中含有与 RegExpObject 匹配的文本,则返回 true,否则返回false。
说明
设r为RegExp对象,s为目标字符串,则(r.test(s))与表示式(r.exec(s) != null)是等价的。