JavaScript正则表达式
一、RegExp对象
两种方法实例化RegExp对象:
- 字面量 如
var reg = /\bis\b/g
- 构造函数 如
var reg = new RegExp('\\bis\\b,'g')
修饰符
- g:全文搜索
- i:忽略大小写
- m:多行搜索
二、元字符
正则表达式由两种基本字符类型组成:
- 原义文本字符
- 元字符(在正则表达式中有特殊含义的非字母字符)
* + ? $ ^ . | \ () {} []
字符 | 含义 |
---|---|
\t | 水平制表符 |
\v | 垂直制表符 |
\n | 换行符 |
\r | 回车符 |
\0 | 空白符 |
\f | 换页符 |
\cX | 与X对应的控制字符(ctrl + X) |
三、字符类
一般情况下正则表达式一个字符对应字符串一个字符。当我们想要匹配对应多个字符时,就可以使用字符类。我们可以使用元字符[]
来构建一个简单的类。如[abc]
表示abc中间的任何一个匹配都将被捕获,而不是只匹配字符串abc。
字符类取反,我们可以使用元字符^
创建反向类/负向类,它的意思是不属于某类的内容。如[^abc]
,表示不属于abc三个字符中的任何一个字符都将被捕获。
四、范围类
当要表示一个范围的时候,我们可以使用范围类,如[a-z]
表示从a到z的任意字符,这是闭区间。
同时在[]
组成的类内部是可以连写的。如[a-zA-Z]
表示从a到z和A到Z的任意字符。
五、预定义类及边界
正则表达式还提供了预定义类来匹配常见的字符类,让我们的书写更方便。
字符 | 等价类 | 含义 |
---|---|---|
. | [^\r\n] | 除了回车符和换行符之外的所有字符 |
\d | [0-9] | 数字字符 |
\D | [^0-9] | 非数字字符 |
\s | [\t\n\x0B\f\r] | 空白符 |
\S | [^\t\n\x0B\f\r] | 非空白符 |
\w | [a-zA-Z_0-9] | 单词字符(字母、数字和下划线) |
\W | [^a-zA-Z_0-9] | 非单词字符 |
此外,还提供了常用的边界匹配字符。
字符 | 含义 |
---|---|
^ | 以xxx开始 |
$ | 以xxx结束 |
\b | 单词边界 |
\B | 非单词边界 |
六、量词
字符 | 含义 |
---|---|
? | 出现零次或一次(最多出现一次) |
+ | 出现一次或多次(至少出现一次) |
* | 出现零次或多次(任意次) |
{n} | 出现n次 |
{n,m} | 出现n到m次 |
{n,} | 至少出现n次 |
七、贪婪模式与非贪婪模式
正则表达式在匹配的时候会尽可能多的匹配,这就叫贪婪模式。如/\d{3,6}/
表示匹配数字最少三次,最多六次;当使用字符串12345678
去应用此正则时,会匹配前六个而不是前三个。
如果我们想要让正则表达式尽可能少的匹配,也就是说一旦匹配成功将不在进行尝试匹配,这就是非贪婪模式,只需在量词后加上?
即可。如/\d{3,6}?/
。
八、分组
我们可以使用()
来进行分组,使量词可以作用于分组。如(abc){3}
,表示匹配abc字符串出现三次的情况。
或|
,表示可选的一种情况。如a|b
,表示匹配a或b。
反向引用,捕获分组的内容进行替换,$1,$2,$3...$n
。
忽略分组,不希望捕获某些分组,?:
。
九、前瞻
正则表达式从文本头部向尾部开始解析,文本尾部方向,称为前。
前瞻就是在正则表达式匹配到规则的时候,向前检查是否符合断言。(后顾/后瞻则相反,JavaScript不支持后顾)
符合和不符合特定断言称为肯定/正向匹配和否定/负向匹配。
- 正向前瞻
exp(?=assert)
- 负向前瞻
exp(?!assert)
十、JS对象属性
- global
- ignore case
- multiline
- lastIndex:是当前表达式匹配内容的最后一个字符的下一个位置(每次匹配都会反应到正则表达式本身)
- source:正则表达式的文本字符串
十一、test和exec方法
- test,用于测试字符串参数中是否存在匹配正则表达式模式的字符串
- exec,使用正则表达式模式对字符串执行搜索,并将更新全局RegExp对象的属性(lastIndex)以反映匹配结果,没有则返回null,否则返回一个结果数组,它具有如下属性:
- index 声明匹配文本的第一个字符的位置
- input 存放被检索的字符串
exec方法非全局调用时,返回的数组第一个是与正则相匹配的文本,第二个是与RegExpObject的第一个子表达式相匹配的文本(也就是第一个分组)(如果有的话),第三个是与RegExpObject的第二个子表达式相匹配的文本。
十二、字符串对象方法
1、search() 用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串
方法返回第一个匹配结果的index,查找不到返回-1,它不执行全局匹配忽略标志g,总是从字符串的开始进行检索。
2、match() 用于找到一个或多个与正则相匹配的文本
它是否具有标志g很大程度上影响结果。
非全局调用。
- 执行一次匹配
- 未找到,返回null,否则返回一个数组,存放了它所找到的匹配文本有关的信息
- 返回的数组第一个是匹配的文本,其余的元素存放的是与正则表达式子表达式匹配的文本
- 此外,返回的数组还具有两个属性,index与input。方法整体与exec类似
全局调用
- 执行全局匹配
- 未找到,返回null,若找到了一个或多个匹配子串,则返回一个数组
- 数组中存放的是字符串中所有的匹配子串,而且没有index和input属性
3、split() 用于把字符串分割成字符串数组
4、replace() 用于替换字符串中指定的字符串
三种参数使用情况
- replace(str,replaceStr)
- replace(reg,replaceStr)
- replace(reg,function)
- function回调函数接受四个参数
- 匹配字符串
- 正则表达式分组内容,没有分组则没有该参数
- 匹配项在字符串中的index
- 原字符串