Javascript正则表达式笔记

386 阅读3分钟

正则表达式

正则表达式创建

// 方法一, 通过`/``/`之间写入表达式
var re = /ab+c/

// 方法二,通过对象 RegExp创建, 第一个参数是字符串表达式,后一个参数是标志,参考后文
var re = new RegExp("ab+c", "flags")

// 如果正则表达式不变,一般用第一种,如果正则表达式会根据程序运行动态改变,就要用第二种。

// 通过字符串表达式创建的正则,需要转义的字符有以下几个
// [ ] \ ^ $ . | ? * + ( )

表达式的方法

exec

返回[...匹配数据],用法:reg.exec(str)

/d(b+)d/g.exec('cdbbdbsbz')
输出:[ "dbbd" ]
match

返回[匹配数据、捕获数据、索引、输入],用法:reg.match(str)

/d(b+)d/g.match('cdbbdbsbz')
输出:[ "dbbd" ]
test

返回布尔值,用法:reg.test(str)

/d(b+)d/g.test('cdbbdbsbz')
输出:true
matchAll TODO

返回一个迭代器,其他暂时没了解过

search

返回匹配索引,未匹配到返回-1,用法:str.search(reg)

'cdbbdbsbz'.search(/d(b+)d/g)
输出:1
replace

替换匹配数据,用法:str.replace(reg, replace)

'cdbbdbsbz'.replace(/d(b+)d/g, '换')
输出:'c换bsbz'
split

根据规格分割数据,用法:str.split(reg)

'cdbbdbsbz'.split(/db+d/g)
输出:['c', 'bsbz']

特殊字符表

断言类

  • ^: 匹配输入的开头
  • $: 匹配输入的结尾
  • \b: 匹配「单词」和「非单词」边界
  • \B: 匹配同类的边界,即「单词」与「单词」之间,「非单词」与「非单词」之间的边界
  • x(?=y): 向前断言,匹配xy跟随
  • x(?!y): 向前否定断言,匹配x不被y跟随
  • (?<=y)x: 向后断言,匹配x跟随y
  • (?<!y)x: 向后否定断言,匹配x不跟随y

PS:「单词」边界中的「单词」在js中指的是\w,即[a-zA-Z0-9_],除此之外称为「非单词」

字符类

  • .: 匹配除了终止符之外的任何单个字符
  • \d: 匹配任何阿拉伯数字。相当于[0-9]
  • \D: 匹配非\d。相当于[^0-9]
  • \w: 匹配基本拉丁字母中的数字字符,相当于[A-Za-z0-9_]
  • \W: 匹配非\w,相当于[^A-Za-z0-9_]
  • \s: 匹配空白字符,包含以下几个,相当于[\f\n\r\t\v\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]:
    • 空格符 (space character)
    • 制表符 (tab character)
    • 回车符 (carriage return character)
    • 换行符 (new line character)
    • 垂直换行符 (vertical tab character)
    • 换页符 (form feed character)
  • \S: 匹配非\s,相当于[^\f\n\r\t\v\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]
  • \t: 匹配制表符 (tab character)
  • \r: 匹配回车符 (carriage return character)
  • \n: 匹配换行符 (new line character)
  • \v: 匹配垂直换行符 (vertical tab character)
  • \f: 匹配换页符 (form feed character)
  • [\b]: 匹配退格符(backspace)
  • \0: 匹配 NULL 字符
  • \xhh: 匹配两位十六进制数
  • \uhhhh: 匹配四位十六进制,Unicode字符

组和范围

  • x|y: 匹配xy字符
  • [xyzA-Z]: 匹配 AZ的字符集合xyz三个字符,其中-为连字符,如果放在开头或结尾将作为普通字符匹配
  • [^xyzA-Z]: 匹配除[xyzA-Z]以外的字符
  • (x): 捕获组,匹配x并记住x
  • \n: n是正整数,引用之前的捕获,例如:/abc(d)ef\1/匹配abcdefg,得到abcdefd

量词

  • 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*?, x+?, x??, x{n}?, x{n,}?, x{n,m}?: 原本x*, x+, x?, x{n}, x{n,}, x{n,m}匹配的是「贪婪」的,后面加上?之后,匹配将变成「非贪婪」

PS:「贪婪」表示全部匹配,「非贪婪」表示只匹配一次

正则表达式标志

正则表达式有六个可选参数 (flags) 允许全局和不分大小写搜索等。这些参数既可以单独使用也能以任意顺序一起使用, 并且被包含在正则表达式实例中

  • g: 全局搜索
  • i: 不区分大小写搜索
  • m: 多行搜索
  • s: 允许.匹配换行符
  • u: 使用unicode码的模式进行匹配
  • y: 执行“粘性(sticky)”搜索,匹配从目标字符串的当前位置开始

参考

MDN-正则表达式