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