JS中的正则表达式用来处理字符组合的,使用场景有两个:RegExp对象的exec、test方法;String对象的match、replace、search、split方法。

perl语言正则表达式语法的一个完整子集

注意:红色为新增用法,或还未纳入规范,或只部分浏览器实现

元字符

( [ { \ ^ $ | ) ? * + .

在正则表达式中使用这些元字符,必须进行转义:/\?/或new RegExp('\\?''),因为JS字符串解析器会按照\n的方式尝试翻译\?,加上两个反斜杠(双重转义)

创建

1. /s/flags,字面量适合表达式确定情况。

2. new RegExp('s'[, flags]),构造实例适合不确定或未知情况

flags参数有5个



正则表达式由简单字符和特殊字符组合而成

Character Classes 字符类(单个)

要使用ASCII来表示一个字符,则必须指定一个两位的十六进制代码,并且前面加上\x。例如字符b的ASCII码为98,等于十六进制的62,表示字符b可以使用\x62。 使用八进制,直接在反斜杠之后跟上八进制数值,例如,b等于八进制的142,所以 /\142/。

. 匹配除\n、\r、\u2028、\u2029行终止外的任意符。
character set中,仅表示简单的点字符。
多行匹配不会改变点行为。
\d 匹配基本Latin表中的数字符,等同[0-9]
\D 匹配基本Latin表中非数字字符,等同[^0-9]
\w 匹配基本Latin表的字母字符,包括下划线,等同[A-Za-z0-9_]
\W [^A-Za-z0-9_]
\s 匹配空白符,包括空格、制表符、换页、换行、其它Unicode spaces,等同[\f\n\r\t\v\u00a0\u1680\u180e\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]
\S [^\f\n\r\t\v\u00a0\u1680\u180e\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]
\t 匹配水平制表符
\r 匹配回车符
\n 匹配换行
\v 匹配垂直制表符
\f 匹配换页
[\b] 匹配退格,不是\b
\0 匹配NUL字符,不要跟随其他字符
\cX 匹配control字符,X表A-Z
\hh 匹配两位十六进制码表示的字符
\uhhhh 匹配四位十六进制的UTF-16码字符
\u{hhhh} 或 \u{hhhhh} 当设置u参数时,匹配十六进制Unicode码的U+hhhh或U+hhhhh
\ 对简单字符,表明下一个字符是特殊的,不要当简单字符处理。
对特殊字符,表明下一个字符当简单字符处理。
\X 匹配任意unicode码,包括换行
\p{Number} 匹配任意数字类unicode码
\p{Alphabetic} 匹配任意字母类unicode码
\p{Math} 匹配任意数学符号

Character Sets 字符组

[xyz]
[x-z]
匹配包括的任意一个字符。可以用连字符来表示范围,但如果连字符出现在组的开头和结尾,只表示普通含义
[^xyz]
[^x-z]

Alternation 候选

x|y 匹配x或y

Boundaries 边界

^ 匹配输入的开头
$ 匹配输入的结尾
\b 匹配单词的边界,Note that a matched word boundary is not included in the match. In other words, the length of a matched word boundary is zero.
\B

Grouping and back references 分组和逆向引用

(x) 匹配x并且记住这个匹配,也叫捕获分组,这些分组按从左到右的左圆括号顺序从1开始编号,匹配的子串可以从结果数组[1],...,[n]或RegExp对象的属性$1,...,$9获得,replace方法还可用特殊序列$1,...,$9获得。捕获分组会有性能损耗。
\n n是正整数. 逆向引用上次的第n个匹配子串(不是模式),匹配和引用的各个分离的部分包含的是完全相同的字符串。
(?:x) 匹配x但不记住匹配,也叫非捕获分组

Quantifiers 量词(多个)

x* 匹配前项0或多次
x+ 匹配1或多次,等同{1,}
x? 0或1次
如果用在任何数量词*、+、?、{}后,会使数量词非贪婪匹配(匹配最小次数,递增方式),相反是贪婪匹配(最大化匹配,递减方式)
x{n} n正整数,匹配精确的n次
x{n,} n正整数,匹配至少n次
x{n,m} n、m是正整数,匹配至少n次,至多m次

Assertions 断言

正向前瞻 lookahead x(?=y) 匹配x,仅当x前面紧随y
负向前瞻,x(?!y) 匹配x,仅当x前面不紧随y
正向后顾 lookbehind (?<=y)x 匹配x,仅当x后面紧随y
负向后顾 (?<!y)x 匹配x,仅当x后面不紧随y

正则实例属性

global 当前表达式模式首次匹配内容的开始位置,初始值为-1,从0开始计数,每次成功匹配时,index属性都会随之改变。
ignoreCase 返回创建RegExp对象实例时指定的ignoreCase标志(i)的状态。如果创建RegExp对象实例时设置了i标志,该属性返回True,否则返回False,默认值为False。
lastIndex 当前表达式模式首次匹配内容中最后一个字符的下一个位置,从0开始计数,常被作为继续搜索时的起始位置,初始值为-1,每次成功匹配时,lastIndex属性值都会随之改变。(只有使用exec()或test()方法才会填入,否则为0)。
lastIndex是实例对象的属性,只有当正则表达式的"g"标记被使用时才被设置。实行以下规则:
如果lastIndex大于字符串的长度,test和exec失败,且lastIndex被设为0。
如果lastIndex等于字串的长度且正则表达式匹配空字符串,则正则表达式从lastIndex的位置开始匹配。
如果lastIndex等于字符串的长度且正则表达式不匹配空字符串,则正则表达式不匹配input,且lastIndex被置为0。
否则,lastIndex被设置成最近一次匹配的下一点。
multiLine 返回创建RegExp对象实例时指定的multiLine标志(m)的状态。静态,如果创建RegExp对象实例时设置了m标志,该属性返回True,否则返回False,默认值为False。
source 返回创建RegExp对象实例时指定的表达式文本字符串。
input,$_ 最后用于匹配的字符串(传递给exec()或test()的字符串)。静态,如果没有给正则表达式的exec或test方法提供字符串,并且RegExp.input中有值,则使用它的值来调用该方法。
脚本或浏览器能够预置input属性。如果被预置了值且调用exec或test方法的时候没有提供字符串,则调用exec或test的时候使用input的值。
input可以被浏览器以下面的方式设置:
当text表单域处理句柄被调用的时候,input被设置为该text输入的字串。
当textarea表单域处理句柄被调用的时候,input被设置为textarea域内输入的字串。注意multiline亦被设置成true从而能匹配多行文本。
当select表单域处理句柄被调用的时候,input被设置成selected text的值。
当链接对象的处理句柄被调用的时候,input被设置成<a>和</a>之间的字符串。
事件理现句柄处理完毕后,input属性的值被清除。
lastMatch,$& 最后匹配的字符
lastParen,$+ 最后匹配的分组
leftContext,$` 在上次匹配的前面的子串
multiline,$* 用于指定是否所有的表达式都使用多行模式的布尔值
rightContext,$' 在上次匹配之后的子串

正则表达式方法

exec 返回数组或null
test 返回true或false,String的search是返回第一次匹配index或-1(不成功)
toSource 返回特定对象的定义(literal representing),其值可用来创建一个新的对象。重载Object.toSource方法得到的。
toString 返回特定对象的串。重载Object.toString方法得到的。