1. 基础知识
简单来讲,正则表达式是一些用来匹配和处理文本的字符串。
// pattern可以使用任何简单或复杂的正则表达式
// flags用以标明正则表达式的行为,每个正则表达式可以带有一个或多个标识
var expression = /pattern/flags
/name/ // 匹配纯文本name
/./ // 匹配任意字符(除换行符外的任意单个字符)
/\./ // 匹配特殊字符.(元字符的使用通常要在前面加上\,不确定是不是元字符,最好加上)
/[abcd]/ // 匹配abcd四个字符中的任一字符
/[0-9]/ // 利用字符集合区间,等价于[0123456789]
/[^0-9]/ // 取非字符,匹配除0-9数字外的任一字符
几个常用的类元字符
/\d/ // 任何一个数字字符(等价于[0-9])
/\D/ // 任何一个非数字字符(等价于[^0-9])
/\w/ // 任何一个字母数字字符(大小写均可)或下划线字符,等价于[a-zA-Z0-9_]
/\W/ // 任何一个非字母数字或下划线字符(等价于[^a-zA-Z0-9_])
/\s/ // 任何一个空白字符(等价于[\f\n\r\t\v])
/\S/ // 任何一个非空白字符(等价于[^\f\n\r\t\v])
2. 常见的标识符
g:表示全局模式,即模式将被用于所有字符串
i:表示不区分大小写模式
m:表示多行模式,即在到达一行文本末尾时还会继续查找下一行中是否存在与模式匹配的项
ES6新增了u修饰符和y修饰符
u:含义为‘Unicode模式’,用来正确处理大于uFFFF的Unicode字符
var s = '?';
/^.$/.test(s) // false
/^.$/u.test(s) // true
y: 表示‘粘连’修饰符,与g修饰符类似,也是全局匹配,后一次匹配都从上一次匹配成功的下一个位置开始。不同之处在于,g修饰符只要剩余的位置存在匹配就可以,而y修饰符会确保匹配必须从剩余的第一个位置开始。
var s = 'aaa_aa_a';
var r1 = /a+/g;
var r2 = /a+/y;
r1.exec(s) // ["aaa"]
r2.exec(s) // ["aaa"]
r1.exec(s) // ["aa"]
r2.exec(s) // null
3.重复匹配
+匹配一个或多个字符
*匹配零个或多个字符
?匹配零个或一个字符
{num}匹配num次重复
{a,b}匹配最少a次,最多b次(b可以为空,例如{a, })
*和+都是所谓的“贪婪型”元字符,它们在进行匹配时的行为模式是多多益善而不是适可而止的,会尽可能地从一段文本的开头匹配到这段文本的末尾。
举例:
var str = '<B>AK</B> and <B>HI</B>';
var pattern = /<[Bb]>.*<\/[Bb]>/g;
str.match(pattern); // 输出['<B>AK</B> and <B>HI</B>']
这种情况下,可以使用这些元字符的“懒惰型”版本。
* => *?
+ => +?
{n, } => {n, }?
var str = '<B>AK</B> and <B>HI</B>';
var pattern = /<[Bb]>.*?<\/[Bb]>/g;
str.match(pattern); // 输出['<B>AK</B>', '<B>HI</B>']
4.位置匹配
单词边界:b用来匹配一个单词的开始或结尾,b匹配且只匹配一个位置,不匹配任何字符。
字符串边界:^用来匹配字符串的开头,$用来匹配字符串的结尾
Tips:^是几个有多重用途的元字符之一,只有当它出现在一个字符集合里(被放在[]之间,并紧跟在左方括号[的后面时,才能发挥“求非”的作用)。
5.回溯引用:前后匹配一致
回溯引用指的是模式的后半部分引用在前半部分定义的子表达式。(可以把回溯引用想象成变量)1代表模式里第一个子表达式,2代表第二个子表达式,以此类推。
举例:
var str = '<BODY><H1>hello</H1><H2>world</H2><H2>!</H3></BODY>';
var pattern = /<([Hh][1-6])>.*?<\/\1>/g;
str.match(pattern); // 输出['<H1>hello</H1>', '<H2>world</H2>']
6.前后查找
向前查找(也称先行断言)指定了一个匹配但不在结果中返回的模式。实际上是一个子表达式,而且从格式上看也是如此。
从语法上看,一个向前查找模式其实是一个以 ?= 开头的子表达式,需要匹配的文本跟在=的后面。
(?=) // 正向前查找
(?!) // 负向前查找
(?<=) // 正向后查找
(?<!) // 负向后查找
正向前查找指的是,x只有在y前面才匹配,必须写成/x(?=y)/。比如,只匹配百分号之前的数字,要写成/d+(?=%)/。负向前查找指的是,x只有不在y前面才匹配,必须写成/x(?!y)/。比如,只匹配不在百分号之前的数字,要写成/d+(?!%)/。
/\d+(?=%)/.exec('100% of US presidents have been male') // ["100"]
/\d+(?!%)/.exec('that’s all 44 of them') // ["44"]
向后查找正好与向前查找相反,x只有在y后面才匹配,必须写成/(?<=y)x/。比如,只匹配美元符号之后的数字,要写成/(?<=$)d+/。负向后查找则与负向前查找相反,x只有不在y后面才匹配,必须写成/(?<!y)x/。比如,只匹配不在美元符号后面的数字,要写成/(?<!$)d+/。
/(?<=\$)\d+/.exec('Benjamin Franklin is on the $100 bill') // ["100"]
/(?<!\$)\d+/.exec('it’s is worth about €90') // ["90"]
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。