正则匹配
正则构造方式:
var reg = new RegExp('abc','ig'); // 或 var reg = /abc/ig;
常用方法:
test:
// test() // regexp.test(string) console.log( /\d+/.test('ds21ds') ) // true
match:
// match() // string.match(regexp) // 若加上量词g则一次性捕获所有匹配的内容放到数组里返回, // 否则,返回值是一个数组,内容包含三项, // 分别是匹配的内容、匹配内容的起始索引、原字符串 console.log( 'ds21ds56gh'.match(/\d+/g) ) // ["21", "56"] console.log( 'ds21ds56gh'.match(/\d+/) ) // ["21", index: 2, input: "ds21ds56gh", groups: undefined] // 或为 null
// 若有分组,则从第二个参数开始是分组内容
console.log( 'ds21ds56gh'.match(/(\d+)/g) ) // ["21", "56"]
console.log( 'ds21ds56gh'.match(/(\d+)/) ) // ["21", "21", index: 2, input: "ds21ds56gh", groups: undefined]
replace:
// replace() // string.replace(值类型 | regexp, 值类型 | 回调函数) var str = "11a22b33c44d";
console.log( str.replace(/\d+/g,'_') ) // _a_b_c_d var newStr = str.replace(/\d+/g, function ($0,$1,$2) { // 第一个形参$0 表示匹配的字符 // 第二个形参$1 表示匹配字符的起始索引 // 第三个形参$2 表示原字符串 return $0*2; }); console.log(str);//11a22b33c44d console.log(newStr);//22a44b66c88d // 若有量词,则分组里面的内容是匹配字符的最后一个字符 var newStr2 = str.replace(/(\d+)/g, function ($0,$1,$2) { // 第一个形参$0 表示匹配的字符 // 若有分组,则从第二个参数开始就是分组的内容 // 倒数第二个形参 表示匹配字符的起始索引 // 倒数第一个形参 表示原字符串 return $0*2; }) console.log(str);//11a22b33c44d console.log(newStr2);//22a44b66c88d
常用字符类:
\d —— 数字。
\D —— 非数字。
\s —— 空格符号,制表符,换行符。
\S —— 除了 \s 。
\w —— 拉丁字母,数字,下划线 '_'。
\W —— 除了 \w。
. —— 任何带有 's' 标志的字符,否则为除换行符 \n之外的任何字符。
贪婪量词和惰性量词
贪婪模式:
默认情况下,正则表达式引擎会尝试尽可能多地重复量词。例如,\d+ 检测所有可能的字符。当不可能检测更多(没有更多的字符或到达字符串末尾)时,然后它再匹配模式的剩余部分。如果没有匹配,则减少重复的次数(回溯),并再次尝试。
懒惰模式:
通过在量词后添加问号 ? 来启用。在每次重复量词之前,引擎会尝试去匹配模式的剩余部分。
在量词之后添加一个问号 '?' 来启用懒惰模式,所以匹配模式变为 *? 或 +?,甚至将 '?' 变为 ??。
匹配前瞻、后瞻:
x(?=y) 前瞻肯定 断言 x ,仅当后面跟着 y
x(?!y) 前瞻否定 断言 x ,仅当后面不跟 y
(?<=y)x 后瞻肯定 断言 x ,仅当跟在 y 后面
(?<!y)x 后瞻否定 断言 x ,仅当不跟在 y 后面
匹配标签的 src 属性:
/\bsrc\b\s*=\s*[\'\"]?([^\'\"]*)[\'\"]?/ig
匹配 script 标签:
/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/
匹配标签:
/<[^>]*>/g /* * 使用时, * str.replace(/<[^>]*>/g,'') */