JavaScript 正则表达式

JavaScript 正则表达式

JavaScript 正则表达式

什么是正则表达式?

正则表达式是一些用来匹配和处理文本的字符串。

语法

可以使用字面量、构造器和工厂标记来创建正则表达式

1
2
3
/partern/flags
new RegExp(pattern[, flags])
RegExp(pattern[, flags])

其中 flags

  • g 全局匹配
  • i 不区分大小写
  • m 多行匹配
  • u Unicode 字符匹配

正则表达式中的特殊字符

字符类

  • . 匹配除行终止符(\n,\r,\u2028 or \u2029)之外的任何单个字符,若在字符集中则仅仅只匹配.
  • \d 匹配任何一个数字字符,相当于 [0-9]
  • \D 匹配任何一个非数字字符,相当于 [^0-9]
  • \w 匹配任何一个字母数字字符,包括下划线,相当于 [A-Za-z0-9_]
  • \W 匹配任何一个非字母数字字符或非下划线字符,相当于 [^A-Za-z0-9_]
  • \s 匹配任何单个空格字符,相当于 [\f\n\r\t\v\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]
  • \S 匹配除了空格外的单个字符,相当于 [^ \f\n\r\t\v\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]
  • \t 匹配一个横向制表符
  • \r 匹配一个回车
  • \n 匹配一个换行符
  • \v 匹配一个垂直制表符
  • \f 匹配一个换页符
  • [\b] 匹配一个删除符
  • \0 匹配 NUL 字符
  • \cX 匹配控制字符

字符集

  • [-a-z-] 匹配方括号中字符中的任何一个,可以使用连字符 - 来指定字符范围,但如果连字符是方括号中的第一个或最后一个字符,则作为普通字符包含在字符集中。也可以在字符集中包含字符类。
  • [^-A-Z-] 匹配除括号中包含的内容外的任何内容

可选字符

  • x|y 匹配 x 或 y 中的一个

边界

  • ^ 匹配开头,如果设置了多行匹配标记,则在换行符后立即匹配
  • $ 匹配结尾
  • \b 匹配单词边界,实际上它匹配的是一个能够构成单词的字符(\w)和一个不能构成单词的字符(\W)之间的位置
  • \B 匹配非单词边界

分组和反向引用

  • (x) 匹配 x 并记录匹配结果,称为捕获分组
  • \n 引用之前的第 n 个 表达式
  • (?:x) 匹配 x 但不记录匹配结果,称为非捕获分组

量词

  • x* 匹配 x 0次或更多次
  • x+ 匹配 x 1次或更多次
  • x? 匹配 x 0次或1次
  • x{n} 匹配 x n次
  • x{n,} 匹配 x 至少n次
  • x{n,m} 匹配 x 至少n次至多m次
  • ? 非贪婪匹配,在量词后加上 ? 表示量词的非贪婪模式,匹配尽可能少的字符

回溯引用

  • x(?=y) 前向查找,仅当 x 后跟 y 时,才匹配 x

    image-20211110161954405
  • (?<=y)x 后向查找,仅当 x 前面有 y 时,才匹配 x

    image-20211110162115215

常用的方法

  • exec()

    在指定的字符串上执行匹配搜索,返回结果数组或 null

    1
    2
    3
    4
    5
    6
    7
    8
    const str = "My ip address is 255.198.99.101 and your ip address 199.123.44.88";
    const reg = /\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/g;

    // Found 255.198.99.101, from index 17, last match from index 31
    // Found 199.123.44.88, from index 52, last match from index 65
    while((res = reg.exec(str)) !== null) {
    console.log(`Found ${res[0]}, from index ${res['index']}, last match from index ${reg.lastIndex}`);
    }
  • test()

    在指定的字符串和一个正则表达式之间执行匹配搜索,返回 truefalse

  • match()

    对给定的字符串进行匹配并返回匹配结果

    1
    2
    3
    4
    5
    const str = "My ip address is 255.198.99.101 and your ip address 199.123.44.88";
    const reg = /\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/g;

    // [ '255.198.99.101', '199.123.44.88' ]
    console.log(str.match(reg));
  • replace()

    使用给定的字符串替换匹配到的结果

  • search()

    在给定的字符串中搜索匹配,并返回首次匹配结果的索引

  • split()

    通过将字符串分隔为子字符串,将字符串拆分为数组。

常用正则表达式

  • 匹配中文字符

    1
    /^[\u4e00-\u9fa5]{0,}$/
  • 匹配双字节字符

    1
    /[^\x00-\xff]/
  • 匹配千分位

    1
    /\B(?=(\b{3})+(?!\d))/
  • 匹配两位小数

    1
    /^([1-9][0-9]*)(\.[0-9]{2})?$/
  • 匹配中国固定电话号码

    最开始的一位一定是 0,接着是 2,3,4位数字组成的区号,然后是7位或8位的电话号码,其中首位不为1

    1
    /\(?0[1-9]\d{1,3}\)?[ -]?[2-9]\d{2,3}[ -]?\d{4}/
  • 匹配统一社会信用代码

    统一社会信用代码由18位数字或者大写字母组成,但是字母不包括 I、O、Z、S、V

    一共由五部分组成:

    第一部分:登记管理部门代码1位 (数字或大写英文字母)

    第二部分:机构类别代码1位 (数字或大写英文字母)

    第三部分:登记管理机关行政区划码6位 (数字)

    第四部分:主体标识码(组织机构代码)9位 (数字或大写英文字母)

    第五部分:校验码1位 (数字或大写英文字母)

    1
    /[0-9A-HJ-NPQRTUWXY]{2}\d{6}[0-9A-HJ-NPQRTUWXY]{10}/

    目前还有老的工商注册代码,也就是15位的社会信用代码,正则表达式如下:(弱校验)

    1
    /[1-9]\d{15}/

    同时支持18位和15位社会信用代码

    1
    /^([0-9A-HJ-NPQRTUWXY]{2}\d{6}[0-9A-HJ-NPQRTUWXY]{10}|[1-9]\d{14})$/
  • 中国邮政编码

    前两位代表省、市、自治区,第三位代表邮区,第四位代表县、市,最后两位代表投递邮局,其中第二位不为 8。

    1
    /\d[0-7|9][0-9]{4}/
  • 中国身份证号码

    前六位是户口所在地编码,其中第一位是 1~8,此后是出生年月日,出生年份只能是 18、19、20,而且是可选的,最后一位校验位是数字或 x

    1
    /[1-8]\d{5}((18)|(19)|(20))?\d{2}(0[1-9]|1[0-2])((0|1|2)[1-9]|3[0-1])\d{3}[\dx]?/

JavaScript 中的特殊字符

Unicode 转义序列 含义 类别
\u0008 \b Backspace
\u0009 \t Tab 空白
\u000A \n 换行符 行终止符
\u000B \v 垂直制表符 空白
\u000C \f 换页 空白
\u000D \r 回车 行终止符
\u0022 " 双引号
\u0027 ' 单引号
\u005C \ \ 反斜杠
\u00A0 不间断空格 空白
\u0028 行分隔符 行终止符
\u0029 段落分割符 行终止符
\uFEFF 字节顺序标记 空白
作者

Y2hlbmdsZWk=

发布于

2018-09-02

更新于

2022-01-14

许可协议