正则笔记

2020/04/05 regexp example

贪婪与非贪婪

贪婪:尽可能匹配更多的字符 + {m,n} * 重复一次或者多次

非贪婪:尽可能少的去匹配 ? 可能有也可能没有

// 贪婪模式会直接匹配第一个 a 到最后一个 a,无视中间出现的 a
// 非贪婪模式则是匹配到第二次出现的 a 就停止了
('abbbaaccca').match(/a.*a/g) // ['abbbaaccca']
('abbbaaccca').match(/a.*?a/g) // ['abbba','accca']

反向引用

表达式在匹配时,会将小括号里匹配到的字符串记录下来。获取引用的方法是使用 \ 加上数字来代表第几次引用。

// 用于匹配前后出现相同的字符比较方便,如引号等。
'"hello", \'world\''.match(/('|").*\1/g) // [ '"hello"', "'world'" ]

// [ '<span>hello </span>', '<p><span>world</span></p>' ]
'<span>hello </span><p><span>world</span></p>'.match(/<(\w+)>.*?<\/\1>/g) 

预搜索、反向预搜索

正向预搜索 /y(?=xxxx)/ 匹配后面是 xxxx 的 y

'iPhone X'.match(/iPhone(?= X)/g) // ['iPhone'] 

/y(?!xxxx)/ 匹配后面不是 xxxx 的 y

'dog,done'.replace(/(do(?!g))/g,'-') //'dog,-ne' 

反向预搜索(后行断言)
/(?<=xxxx)y/ 匹配前面是 xxxx 的 y 位置

'user:1024 free:2048'.match(/(?<=user:)(\d+)/g) // ['1024']

/(?<=xxxx)y/ 匹配前面不是 xxxx 的 y 位置

'1234.5678'.match(/(?<!\.\d*)\d+/g) // 1234 11 22
// 小数部分不会被匹配

Search

    Table of Contents