共计 2480 个字符,预计需要花费 7 分钟才能阅读完成。
零根底学习举荐: https://juejin.cn/post/6844903845227659271
正则表达式手册: http://tool.oschina.net/uploads/apidocs/jquery/regexp.html
1. 元字符汇总
分组与回溯援用:
元字符 | 形容 |
---|---|
(pattern) | ()会把每个分组里的匹配的值保存起来,从左向右,以分组的左括号为标记,第一个呈现的分组的组号为 1,第二个为 2,以此类推 |
(?:pattern) | (?:) 示意非捕捉分组,和捕捉分组惟一的区别在于,非捕捉分组匹配的值不会保存起来; |
\1 或 \2 等 | 示意反复正则第一个 (或第二个) 圆括号内匹配到的内容 |
注: (?:pattern) 在应用 “ 或 ” 字符 (|) 来组合一个模式的各个局部很有用。例如,’industr(?:y|ies)’ 就是一个比 ‘industry|industries’ 更简略的表达式。因为咱们独自存储下“y”或者“ies”没有什么意义
2. 正则表达式在 JS 中的应用
2.1 根本用法
let reg1 = /asd/;
let reg2 = new RegExp("asd","g");// 匹配办法 匹配模式
typeof /asd/;//object
/as/.test("asd");//true
/asd/.test("assd");//false
/asd/.exec("asd");
//["asd", index: 0, input: "asd", groups: undefined]
/asd/.exec("assd");//null
在 exec 中匹配到了就会返回一个数组对象,数组对象中第一项是第一个满足匹配得字符串,第二项得是满足匹配开始得下标。第三项是被匹配得输出。groups 是命名捕捉组。
2.2 配合字符串办法应用
字符串 String 具备 match 和replace和 search 和split办法
"asd".match("as");//["as", index: 0, input: "asd", groups: undefined]
"asd".match(/as/);//["as", index: 0, input: "asd", groups: undefined]
// 没有就是 null
"asd".replace(/as/,"sa");// "sad" 不会扭转原字符串,没匹配就不变
"asd".search(/dd/);//-1 返回第一个匹配得地位下标,没有就 -1
"asd".search(/sd/);//1
"asd".split(/s/);//["a", "d"];
replace 配合正则应用详解
replace() 办法的第二个参数能够是一个 文本 ,也能够是一个 函数 ,在只有一个匹配项(即与模式匹配的字符串)的状况下,会向这个函数传递 3 个参数:模式的匹配项,模式匹配项在字符串中的地位和原始字符串。在正则表达式中定义了多个捕捉组的状况下,传递给函数的参数顺次 模式的匹配项 , 第一个捕捉组的匹配项 , 第二个捕捉组的匹配项 …,但 最初两个参数 依然别离是 模式的匹配项在字符串中的地位 和原始字符串。
var toUrl = 'user/add?id=$18&t=update'.replace(/\$(\d+)/g, function (a, b, c, d) {console.log(a); //$18,\$(\d+)匹配的模式匹配项
console.log(b); //18,(\d+)匹配的第一个捕捉组的匹配项
console.log(c); //12, 匹配项的地位
console.log(d); //user/add?id=$18&t=update, 原始字符串
});
replace 第二个参数若是一个函数:
- 匿名函数执行多少次,取决于正则能在字符串中捕捉多少次
- 每次执行匿名函数,arguments 值和通过 exec 捕捉到的内容很相似
- return 返回值就是须要去替换的内容
var str = 'pku2016pku2017';
str = str.replace(/(\d+)/g, function () {console.log(arguments);
// 第一次执行:["2016", "2016", 7, "pkusoft2016pkusoft2017"]
// 数组中各项解释:[正则匹配项,()中匹配的项, 地位, 原 str]
// 第二次执行:["2017", "2017", 18, "pkusoft2016pkusoft2017"]
// 返回的数组和执行 exec 返回的后果统一
return '0000';
});
console.log(str); // pkusoft0000pkusoft0000
3. 其它
3.1 命名组
具名组匹配 在圆括号外部 ,在模式的头部增加 问号尖括号 和组名,就能够在 exec 办法上返回后果的 groups 上找到该组名。
let reg = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/
"1999-01-24".match(reg) // 留神 groups
"1999-01-24".replace(reg, "$<day>-$<month>-$<year>")//"24-01-1999"
3.2 exec 的迭代以及状态记录
当你应用全局匹配的时候,会有状态位值叠加
let str = "wowowo"
let reg = /wo/g
console.log(reg.exec(str)) // ["wo", index: 0, input: "wowowo", groups: undefined]
console.log(reg.exec(str)) // ["wo", index: 2, input: "wowowo", groups: undefined]
console.log(reg.exec(str)) // ["wo", index: 4, input: "wowowo", groups: undefined]
console.log(reg.exec(str)) // null
console.log(reg.exec(str)) // ["wo", index: 0, input: "wowowo", groups: undefined]