JS中的正则表达式用来处理字符组合的,使用场景有两个:RegExp对象的exec、test方法;String对象的match、replace、search、split方法。
perl语言正则表达式语法的一个完整子集
注意:红色为新增用法,或还未纳入规范,或只部分浏览器实现
元字符
( [ { \ ^ $ | ) ? * + .
在正则表达式中使用这些元字符,必须进行转义:/\?/或new RegExp('\\?''),因为JS字符串解析器会按照\n的方式尝试翻译\?,加上两个反斜杠(双重转义)
创建
1. /s/flags,字面量适合表达式确定情况。
2. new RegExp('s'[, flags]),构造实例适合不确定或未知情况
flags参数有5个
- g,全局匹配
- i,忽略大小写,默认不忽略
- m,多行,处理由\n或\r断行的每行的开头^和结尾$,默认单行
- u,unicode; 按unicode代码点处理
- y,sticky; 仅当表达式存在目标字符串中时,从lastindex属性所指的index开始匹配,且不尝试往后匹配,matches only from the index indicated by the lastIndex property of this regular expression in the target string (and does not attempt to match from any later indexes)
正则表达式由简单字符和特殊字符组合而成
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方法得到的。 |