关于javascript:JS笔记1正则表达式

33次阅读

共计 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 具备 matchreplacesearchsplit办法

"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 第二个参数若是一个函数:

  1. 匿名函数执行多少次,取决于正则能在字符串中捕捉多少次
  2. 每次执行匿名函数,arguments 值和通过 exec 捕捉到的内容很相似
  3. 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]

正文完
 0