JavaScript正则表达式

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
2
3
4
5
6
7
8
9
10
11
var reg = /\d(\w)\d/;
var ts = '1a2b3c4d5e';
var ret = reg3.exec(ts);
console.log(ret);
// 以下是打印的返回数组
["1a2", "a", index: 0, input: "1a2b3c4d5e"]
0:"1a2"
1:"a"
index:0
input:"1a2b3c4d5e"
length:2

十二、字符串对象方法

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
    • 原字符串