js 正则表达式
创建正则两种方式
字面量创建正则
const r=/test/;
对象创建正则
let r1=new RegExp("test")
调用正则的test方法判断是否符合规则 返回true或false
console.log(r.test('test'))
console.log(r1.test("test"))
调用字符串的match方法返回匹配的字符串
修饰符
i 大小写不敏感
let reg=/abc/i console.log(reg.test('ABC')) //true
g 查找所有的匹配项
如果不带g,正则过程中字符串从左到右匹配,找到第一个符合条件的即匹配成功,返回
如果带g,则字符串从左到右,找到每个符合条件的都记录下来,知道字符串结尾位置
let s = 'acccccf'; let m=s.match(/c/g);//[ 'c', 'c', 'c', 'c', 'c' ]
m 多行查找
若存在换行\n并且有开始^或结束$符的情况下,
和g一起使用实现全局匹配,因为存在换行时默认会把换行符作为一个字符任务匹配字符串是个单行,
g只匹配第一行,添加m之后实现多行,每个换行符之后就是开始
let s = 'cccd\nccf'; let m=s.match(/^c+/gm);//[ 'ccc', 'cc' ]
s
u
y
边界符
^ 开始符
//以c开头的字符串 let p=/^c/;
$ 结束符
//以c结尾的字符串 let p=/c$/;
重复字符匹配
* 零到多次 相当于{0,}
//字符串中包含0个或多个c 贪婪模式 let p=/c*?/;
+ 一到多次 相当于{1,}
//字符串中包含一个或多个c 贪婪模式 let p=/c+?/;
?零到一次 相当于{0,1}
//包含0个或1个c 贪婪模式 let p=/c??/;
. 任意一个字符
//从字符串首位,匹配任意一个字符, let s = 'acccf'; let m = s.match(/./); console.log(m);//a
{n}正好次
//字符串中字母c至 let p=/c{3}/;
{n,} n到多次
let s = 'acccf'; let m = s.match(/c{2,}/); //ccc let m = s.match(/c{2,}?/); //cc
{n,m}n到m次
let s = 'acccccf'; let m = s.match(/c{2,3}/); //ccc let m = s.match(/c{2,3}?/); //cc
范围符号
中括号表示一个字符
[x]
//字符串中包含一个字母a let p=/[a]/; //字符串第一个字母必须是a let p=/^[a]/;
[x-y]
//字符串中包含a-z中任意一个字母 let p=/[a-z]/; //字符中第一个字母是a-z中的一个 let p=/^[a-z]/;
[x|y]
//字符串中有一个字母a或者c let p=/[a|z]/; //字符串的第一位必须是a或者c let p=/^[a|z]/;
() 匹配一段字符
let s = '吃葡萄不吐葡萄皮不吃葡萄倒吐葡萄皮'; let m=s.match(/吃(.*)不吐/); // [ // '吃葡萄不吐', // '葡萄', // index: 0, // input: '吃葡萄不吐葡萄皮不吃葡萄倒吐葡萄皮', // groups: undefined // ] console.log(m);
(?:) 只匹配不存匹配的结果,只返回字符串匹配后结果
let s = '吃葡萄不吐葡萄皮不吃葡萄倒吐葡萄皮'; let m=s.match(/吃(?:.*)不吐/); //[ '吃葡萄不吐', index: 0, input: '吃葡萄不吐葡萄皮不吃葡萄倒吐葡萄皮', groups: undefined ] console.log(m);
(?=) 索时加的后置条件
let s = '吃葡萄不吐葡萄皮,不吃葡萄倒吐葡萄皮'; let m=s.match(/不吐(?=葡萄皮)/);// // [ '不吐', index: 3, input: '吃葡萄不吐葡萄皮,不吃葡萄倒吐葡萄皮', groups: undefined ]
(?<=) 搜索时加的前置条件
let s = '吃葡萄不吐葡萄皮,不吃葡萄倒吐葡萄皮'; let m=s.match(/(?<=不吐)葡萄皮/);// // [ '葡萄皮', index: 5, input: '吃葡萄不吐葡萄皮,不吃葡萄倒吐葡萄皮', groups: undefined ]
(?!)搜索时加的后置否定条件
let s = '吃葡萄不吐葡萄皮,不吃葡萄倒吐葡萄皮'; let m=s.match(/不(?!吐)/); // [ '不', index: 9, input: '吃葡萄不吐葡萄皮,不吃葡萄倒吐葡萄皮', groups: undefined ]
带\x特殊含义的字符
\w和 \W
// \w 任意ASCII字符 [0-9A-Za-z] // let text = '6' // let p=/[\w]/ // \W 非 任意ASCII字符 // let text = '码' // let p=/[\W]/
\d \D
// \d [0-9] // let text='9' // let p=/\d/ // \D [^0-9] // let text='A' // let p=/\D/
\s \S
// \s 空格 // let text=' ' // let p=/\s/ // /S 非空格 // let text='码' // let p=/\S/
\t
\b
\ 转义字符
贪婪和懒惰模式
默认情况下是贪婪模式他会尽可能多的匹配字符,而懒惰模式会尽可能少的匹配字符
let s='asssb' let p=/s{1,3}/; //贪婪模式得到sss let p=/s{1,3}?/; //懒惰模式得到s
字符串和正则的几个方法
test
match 字符串中的方法 筛选出匹配字符串
如果没有g标志,只会查找第一个匹配项
let s = 'acccccf'; //默认只找一个,全局模式会找所有 let m=s.match(/c/); //[ 'c', index: 1, input: 'acccccf', groups: undefined ] //let m=s.match(/c/g); //[ 'c', 'c', 'c', 'c', 'c' ]
exec 等于给match传一个非全局正则
matchAll 返回一个迭代器 ES2020新增
search 字符串中的方法,
let s = 'acccccf';
//接收字符串或者正则返回索引位置
let m=s.search('c'); //1
let m=s.search(/c/); //1
split
replace