javascript中的正则表达式用RegExp类型表示,有两种写法:一种是字面量写法;另一种是构造函数写法
正则表达式字面量写法,又叫Perl写法
var expression = /pattern/flags;
正则表达式的匹配模式支持下列3个标志:
g:表示全局(global)模式,即模式将被应用于所有字符串,而非在发现第一个匹配项时立即停止
i:表示不区分大小写(case-insensitive)模式,即在确定匹配项时忽略模式与字符串的大小写
m:表示多行(multiline)模式,即在到达一行文本末尾时还会继续查找下一行中是否存在与模式匹配的项
RegExp构造函数
var re = new RegExp(‘at’,’g’);
由于 RegExp 构造 函数的模式参数是字符串,所以在某些情况下要对字符进行双重转义。所有元字符都必须双重转义,那 些已经转义过的字符也是如此,例如\n(字符\在字符串中通常被转义为\,而在正则表达式字符串中就 会变成\\)。
元字符
在javascript中,共有14个元字符(meta-character)
() [] {} \ ^ $ | ? * + .
| 元字符 | 名称 | 匹配对象 |
|---|---|---|
| . | 点号 | 单个任意字符(除回车\r、换行\n、行分隔符\u2028和段分隔符\u2029外) |
| [] | 字符组 | 列出的单个任意字符 |
| [^] | 排除型字符组 | 未列出的单个任意字符 |
| ? | 问号 | 匹配0次或1次 |
| * | 星号 | 匹配0交或多次 |
| + | 加号 | 匹配1次或多次 |
| {min,max} | 区间量词 | 匹配至少min次,最多max次 |
| ^ | 脱字符 | 行的起始位置 |
| $ | 美元符 | 行的结束位置 |
| | | 竖线 | 分隔两边的任意一个表达式 |
| () | 括号 | 限制多选结构的范围,标注量词作用的元素,为反向引用捕获文本 |
| \1,\2… | 反向引用 | 匹配之前的第一、第二…组括号内的表达式匹配的文本 |
RegExp实例属性
global:布尔值,表示是否设置了 g 标志。
ignoreCase:布尔值,表示是否设置了 i 标志。
lastIndex:整数,表示开始搜索下一个匹配项的字符位置,从 0 算起。
multiline:布尔值,表示是否设置了 m 标志。
source:正则表达式的字符串表示,按照字面量形式而非传入构造函数中的字符串模式返回
RegExp实例方法
RegExp 对象的主要方法是 exec(),该方法是专门为捕获组而设计的。exec()接受一个参数,即 要应用模式的字符串,然后返回包含第一个匹配项信息的数组;或者在没有匹配项的情况下返回 null。 返回的数组虽然是 Array 的实例,但包含两个额外的属性:index 和 input。其中,index 表示匹配 项在字符串中的位置,而 input 表示应用正则表达式的字符串。
|
|
正则表达式的第二个方法是 test(),它接受一个字符串参数。在模式与该参数匹配的情况下返回 true;否则,返回 false。
指定匹配的位置
^ 匹配一个输入或一行的开头,/^a/匹配”an A”,而不匹配”An a”
$ 匹配一个输入或一行的结尾,/a$/匹配”An a”,而不匹配”an A”
x|y 匹配x或y
\b 匹配一个单词的边界
\B 匹配一个单词的非边界
量词
* 匹配前面元字符0次或多次,/ba/将匹配b,ba,baa,baaa
+ 匹配前面元字符1次或多次,/ba/将匹配ba,baa,baaa
? 匹配前面元字符0次或1次,/ba*/将匹配b,ba
{n} 精确匹配n次
{n,} 匹配n次以上
{n,m} 匹配n-m次
预定义特殊字符
\n 匹配一个换行符
\r 匹配一个回车符
\t 匹配一个制表符
\v 匹配一个重直制表符
\t 制表符
\cX 这儿,X是一个控制符,/\cM/匹配Ctrl-M
[\b] 匹配一个退格符
预定义类
\d 匹配一个字数字符,/\d/ = /[0-9]/
\D 匹配一个非字数字符,/\D/ = /[^0-9]/
\s 匹配一个空白字符,包括\n,\r,\f,\t,\v等
\S 匹配一个非空白字符,等于/[^\n\f\r\t\v]/
\w 匹配一个可以组成单词的字符(alphanumeric,这是我的意译,含数字),包括下划线,如[\w]匹配”$5.98”中的5,等于[a-zA-Z0-9]
\W 匹配一个不可以组成单词的字符,如[\W]匹配”$5.98”中的$,等于[^a-zA-Z0-9]。
[…] 字符集(character set),匹配这个集合中的任一一个字符(或元字符)
[^…] 不匹配这个集合中的任何一个字符
任意字符
. IE下[^\n],其它[^\n\r] 匹配除换行符之外的任何一个字符
贪婪量词与惰性量词
用贪婪量词进行匹配时,它首先会将整会字符串当成一个匹配,如果匹配的话就退出,如果不匹配,就截去最后一个字符进行匹配,如果不匹配,继续将最后一个字符截去进行匹配,直到有匹配为止。直到现在我们遇到的量词都是贪婪量词
用惰性量词进行匹配时,它首先将第一个字符当成一个匹配,如果成功则退出,如果失败,则测试前两个字符,依些增加,直到遇到合适的匹配为止
惰性量词仅仅在贪婪量词后面加个”?”而已,如”a+”是贪婪匹配的,”a+?”则是惰性的
括号
括号有两个功能,分别是分组和引用。
分组:如果把一个表达式用括号包围起来,这个元素就是括号里的表达式,被称为子表达式,如果希望字符串’ab’重复出现2次,应该写为(ab){2},而如果写为ab{2},则{2}只限定b
捕获: console.log(/(\d{4})-(\d{2})-(\d{2})/.test(‘2016-06-23’));//true
console.log(RegExp.$1);//‘2016’
console.log(RegExp.$2);//‘06’
反向引用
英文中不少单词都有重叠出现的字母,如shoot或beep。若想检查某个单词是否包含重叠出现的字母,则需要引入反向引用(back-reference)
反向引用允许在正则表达式内部引用之前捕获分组匹配的文本,形式是\num,num表示所引用分组的编号
console.log(/([a-z])\1/.test(‘aa’));//true
单词边界
在文本处理中经常可能进行单词替换,比如把row替换成line。但是,如果直接替换,不仅所有单词row都被替换成line,单词内部的row也会被替换成line。要想解决这个问题,必须有办法确定单词row,而不是字符串row
为了解决这类问题,正则表达式提供了专用的单词边界(word boundary),记为\b,它匹配的是’单词边界’位置,而不是字符。\b匹配的是一边是单词字符\w,一边是非单词字符\W的位置
console.log(/\ban\b/.test(‘an’));//true
console.log(/\ban\b/.test(‘and’));//false
优先级
//从上到下,优先级逐渐降低
\ 转义符
() (?!) (?=) [] 括号、字符组、环视
* + ? {n} {n,} {n,m} 量词
^ $ 起始结束位置
| 选择