规则
尽可能多匹配 - 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]*)/)