javaScript 正则表达式

============================================正则表达式基础知识==============================================

^ 匹配一个输入或一行的开头,/^a/匹配"an A",而不匹配"An a"

$ 匹配一个输入或一行的结尾,/a$/匹配"An a",而不匹配"an A"

* 匹配前面元字符0次或多次,/ba*/将匹配b,ba,baa,baaa

+ 匹配前面元字符1次或多次,/ba+/将匹配ba,baa,baaa

? 匹配前面元字符0次或1次,/ba?/将匹配b,ba

(x) 匹配x保存x在名为$1...$9的变量中

x|y 匹配x或y

{n} 精确匹配n次

{n,} 匹配n次以上

{n,m} 匹配n-m次

[xyz] 字符集(character set),匹配这个集合中的任一一个字符(或元字符)

[^xyz] 不匹配这个集合中的任何一个字符

[\b] 匹配一个退格符

\b 匹配一个单词的边界

\B 匹配一个单词的非边界

\cX 这儿,X是一个控制符,/\cM/匹配Ctrl-M

\d 匹配一个字数字符,/\d/ = /[0-9]/

\D 匹配一个非字数字符,/\D/ = /[^0-9]/

\n 匹配一个换行符

\r 匹配一个回车符

\s 匹配一个空白字符,包括\n,\r,\f,\t,\v等

\S 匹配一个非空白字符,等于/[^\n\f\r\t\v]/

\t 匹配一个制表符

\v 匹配一个重直制表符

\w 匹配一个可以组成单词的字符(alphanumeric,这是我的意译,含数字),包括下划线,如[\w]匹配"$5.98"中的5,等于[a-zA-Z0-9]

\W 匹配一个不可以组成单词的字符,如[\W]匹配"$5.98"中的$,等于[^a-zA-Z0-9]。

正则表达式的定义

一个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)是等价的。