文章目录
  1. 1. 相关概念
    1. 1.1. 用途
    2. 1.2. 语法
      1. 1.2.1. 定界符//
      2. 1.2.2. 定位符
      3. 1.2.3. 元字符
        1. 1.2.3.1. 字符类
        2. 1.2.3.2. 量词限定符
        3. 1.2.3.3. 运算符
    3. 1.3. 转义字符
  2. 2. JS 中的正则
    1. 2.1. 定义
      1. 2.1.1. 用字面量形式
      2. 2.1.2. 用 RegExp 构造函数
      3. 2.1.3. 对比
    2. 2.2. RegExp 的实例属性
    3. 2.3. RegExp 的实例方法
      1. 2.3.1. exec()
      2. 2.3.2. test()
    4. 2.4. RegExp 构造函数的属性
  3. 3. 其他
  4. 4. 参考

相关概念

用途

模式匹配:有效性验证、提取子串、查找特定字符、替换

语法

定界符//

格式:/匹配模式/

定位符

  1. ^ 开头
  2. $ 结束
  3. b 单词边界
  4. B 非单词边界

元字符

元字符:具有特殊意义的字符

字符类

  1. s 空白字符,比如空格、tab键、换行
  2. S 非空白字符
  3. w 字母、数字、下划线
  4. W 非w
  5. d 数字
  6. D 非数字
  7. . 除换行外的所有字符

说明:
d 不匹配圆角的0-9的字符
w 不匹配汉字、不匹配圆角的数字、字母、下划线
s 开头的中间的结尾的空白字符 都会匹配
s和S w和W d和D 等可认为是互逆运算

量词限定符

量词,限定符:规定给定的组件必须要出现多少次才能满足匹配

  1. +至少1次 (前导字符在目标对象中连续出现)
  2. *0次 或 多次
  3. ?0次 或 1次
  4. {n} 非负整数 匹配确定的n次
  5. {n,} 至少匹配n次
  6. {n,m} 匹配n到m次

运算符

  1. [] 指定一个范围。eg. [a-zA-Z0-9]
  2. () 组合字符串,所包含的内容必须同时一起。
    eg. ([a-z][A-Z][0-9]),aA0匹配,aAA不匹配
  3. | 管道符,或的意思,多个不同的模式。
    eg. (fo|foo|fool),匹配fo, 也匹配foo,也匹配 fool
  4. ^ 否定运算符。
    一般出现在[]内部的是否定运算符,[]之外的是定位符^。eg. [^0-9] 表示除0-9数字之外的所有字符

转义字符

JS 中的正则

定义

ECMAScript 通过 RegExp 类型支持正则表达式

用字面量形式

用字面量形式定义正则表达式,格式是:

1
var expession = /pattern/flags; //patttern 是模式,flags 是标识

3个 flags 标识
g 全局模式(global)
i 不区分大小写模式(case-insensitive)
m 多行模式(multiline)

比如:
/at/g 匹配字符串中所有”at”的实例
/[bc]at/i 匹配第一个”bat”或”cat”,不区分大小写
/.at/gi 匹配所有以”at”结尾的3个字符的组合,不区分大小写

patttern 模式中的元字符
元字符共有14个 ^$. []{}?+* ()| \
在模式中使用元字符时,都必须进行转义
比如:
/[bc]at/i 匹配第一个”[bc]at”,不区分大小写
/.at/gi 匹配所有以”.at”结尾的字符组合,不区分大小写

用 RegExp 构造函数

1
var pattern = new RegExp("pattern", "flags"); //patttern 是模式,flags 是标识

注意,此处参数 pattern 和 flag 都是 string 类型,而不带正则表达式的定界符 //

对比

相同点:以下的两个正则表达式是完全等价的
var pattern1 = /[bc]at/i;
var pattern2 = new RegExp(“[bc]at”, “i”);

不同点:RegExp 的构造函数的参数都是字符串,所以在某些情况下就需要对字符进行双重转义,比如字符 \ 在字符串中通常被转义成 \

RegExp 的实例属性

正则表达式的每一个实例都具有以下属性(可以取得有关模式的基本信息)

  1. global
  2. ignoreCase
  3. multiline
  4. source 正则表达式的字符串表示,按照字面量形式传入的(而不管它是以字面量形式创建还是 RegExp 构造函数创建的)
  5. lastIndex 整数,表示开始搜索下一个匹配项的字符位置,从0开始


通过这些属性可以获得一个正则表达式的各方面的信息,不过没多大用处。因为这些信息大部分都包含在模式声明中。
lastIndex 属性在配合方法 exec() 时还是有用处的。

RegExp 的实例方法

exec()

exec() 专门为捕获组而设计
参数:要应用模式的字符串
返回:包含第一个匹配项信息的数组 或者 null
数组的第一项是:与整个模式匹配的字符串
数组的第二项(及其他项都是)是:与模式中的捕获组匹配的字符串(如果模式中没有捕获组,那数据就只含有1项!)

数组的实例,有两个额外的属性:
index 表示匹配项在字符串中的位置
input 表示应用正则表达式的字符串

对 exec()而言,即使在模式中设置了全局标志 g,它每次也只会返回一个匹配性
它的作用在于:每次调用 exec() 都会在字符串中继续查找新的匹配项。
而不设置 g 时,在同一个字符串上多次调用 exec() 将始终返回第一个匹配项的信息。
此外,注意 lastIndex 属性的变化!

test()

test() 只判断是否匹配,
参数:字符串
返回:当模式与字符串匹配时,返回true;否则返回false

如果只想知道目标字符串与某个模式是否匹配,但不需要知道其文本内容的情况下,这个方法很方便。test() 方法经常用于 if() 语句中。
场景:验证用户输入的情况下

其他方法:
.toString() 和 .toLocaleString() 这两方法都会返回正则表达式的字面量,与创建的方式无关。字符串形式的字面量。
.valueOf() 返回正则表达式本身

RegExp 构造函数的属性

这些属性,可以理解为是:静态的。即是全局的。
它们适用于作用域中的所有正则表达式,并且是基于最近一次执行的正则表达式操作而变化。

利用这些属性,可以从 exec() 和 test() 执行的操纵中提取更具体的信息。比如:最近一次要匹配的字符串;最近一次的匹配项;最近一次匹配的捕获组;匹配项目左边、右边的内容(自我感觉用处不大,故未列出。详情参考P108)

除了这些外,还有多达9个用于存储捕获组的构造函数属性。可以像如下访问:
RegExp.$1
RegExp.$2

RegExp.$9
分别存储第1到9个匹配的捕获组。

在调用 exec() 和 test() 方法时,这些属性会被自动填充。然后我们就可以直接使用啦。

其他

String对象支持正则的方法

  • search() 检索
  • match() 查找
  • replace() 替换
  • split() 分割

参考

《JavaScript高级程序设计(第3版)》 中的第5章 引用类型: 5.4 RegExp 类型
Q1: 字符串中的字符为什么要进行转义?都有哪些字符?eg. \ 会被转义成 \

文章目录
  1. 1. 相关概念
    1. 1.1. 用途
    2. 1.2. 语法
      1. 1.2.1. 定界符//
      2. 1.2.2. 定位符
      3. 1.2.3. 元字符
        1. 1.2.3.1. 字符类
        2. 1.2.3.2. 量词限定符
        3. 1.2.3.3. 运算符
    3. 1.3. 转义字符
  2. 2. JS 中的正则
    1. 2.1. 定义
      1. 2.1.1. 用字面量形式
      2. 2.1.2. 用 RegExp 构造函数
      3. 2.1.3. 对比
    2. 2.2. RegExp 的实例属性
    3. 2.3. RegExp 的实例方法
      1. 2.3.1. exec()
      2. 2.3.2. test()
    4. 2.4. RegExp 构造函数的属性
  3. 3. 其他
  4. 4. 参考