笔记:正则表达式

179 阅读2分钟

规则

尽可能多匹配 - g,不区分大小写 - i,多行匹配 - m

1. 普通字符

  • /[abc]/ => 匹配[]中所有字符
  • /[^abc]/ => 匹配[]中^后所有未出现的字符
  • /[a-z]/ => 匹配[]区间内的所有字符
  • /./ => 匹配除换行符(\n、\r)以外的所有字符 === /[^\n\r]/
  • /\s/ => 匹配所有空白符, 包括换行 | /\S/ => 匹配所有非空白符
  • /\d/ => 匹配数字 === /[0-9]/
  • /\w/ => 匹配数字字母下划线 === /[a-zA-Z0-9]/

2. 非打印字符

  • \cx => 匹配由x指明的控制符, x的值为a-z或A-Z之一
  • \f 换页符 === \x0c | \cL
  • \n 换行符 === \x0a | \cJ
  • \r 回车符 === \x0d | \cM
  • \t 制表符 === \x09 | \cI
  • \v 垂直制表符 === \x0b | \cK

3. 限定符

  • ? 零次或一次 => /abc?/ => ab、abc
  • * 零次或多次 => /abc*/ => ab、abc、abcc
  • + 一次或多次 => /abc+/ => abc、abcc
  • {n} 匹配n次 => /abc{2}/ === abcc
  • {n,} 匹配至少n次
  • {n,m} 匹配n到m次
贪婪和非贪婪

*+都是贪婪的, 他们会尽可能多的匹配字符, 只要在它们后面加上一个?就可以实现非贪婪最小匹配。

let str = 'abcdefgabcdefg';
let pattern1 = /a[a-z]*d/;
let pattern2 = /a[a-z]*?d/;
str.match(pattern1); // ['abcdefgabcd']
str.match(pattern2); // ['abcd']

4.定位符

  • ^ => 起始符
  • $ => 终止符
  • \b => 单词边界(字符和空格间的位置)
  • \B => 非单词边界
    let str = '666class class666 cla666ss';
    str.match(/\b666/); // 匹配666class中的666
    str.match(/666\b/); // 匹配class666中的666
    str.match(/\B666\B/); // 匹配cla666ss中的666

5. 选择

通过()把所有选项括起来, 相邻的选项之间用|分割; ()表示捕获分组, 会把()中匹配的值保存下来, 可以通过\n进行使用(n是数字代表第n个捕获组)

let str = '666class 666class666 cla666ss';
str.match(/([0-9]+[a-z]+) \1/g); // ['666class 666class']

使用()就会使相关的匹配缓存起来,可以使用?:取消缓存。 str.match(/(?:[0-9]+[a-z]+) \1/g); // null

区分 ?= 、?<= 、?! 、?<!

let str = '111class 222class333  aaaclass cla444ss';
str.match(/([0-9]+)(?=class)/g); // ['111', '222']
//exp1(?=exp2) => 查找后面是exp2的exp1(正向肯定预查)
str.match(/(?<=class)([0-9]+)/g); // ['333']
//(?<=exp2)exp1 => 查找前面是exp2的exp1(反向肯定预查)
str.match(/([0-9]+)(?!class)/g); // ['11', '22', '333', '444']
//exp1(?!exp2) => 查找后面不是exp2的exp1(正向否定预查)
str.match(/(?<!class)([0-9]+)/g); // ['111', '222', '33', '444']
//(?!exp2)exp1 => 查找前面不是exp2的exp1(反向否定预查)

解析地址

let url='https://juejin.cn:8080/creator/content/article/essays?status=all';
// (\w+)匹配一次或多次数字字母下划线
// (:\/\/)匹配://
// ([^:/]+)匹配一次或多次非:或/的其他字符
// ((:\d+)?)匹配零次或一次(: 和 一个或多个数字)
// ([^# ]*)匹配零次或多次非#或空格的字符
let arr=url.match(/(\w+):\/\/([^:/]+)(:\d+)?([^#\s]*)/)