首先用一張表來總說對比
注:pattern 為RegExp的實例, str 為String的實例
用法 | 說明 | 返回值 |
---|---|---|
pattern.test(str) | 判斷str是否包含匹配結果 | 包含返回true,不包含返回false。 |
pattern.exec(str) | 根據pattern對str進行正則匹配 | 返回匹配結果數組,如匹配不到返回null |
str.match(pattern) | 根據pattern對str進行正則匹配 | 返回匹配結果數組,如匹配不到返回null |
str.replace(pattern, replacement) | 根據pattern進行正則匹配,把匹配結果替換為replacement | 一個新的字符串 |
要注意的是:test和exec是正則表達式對象的操作方法,match和replace是字符串的操作方法
另外,這里插入一點,md的表格語法
Markdown 制作表格使用 | 來分隔不同的單元格,使用 - 來分隔表頭和其他行。
語法如下:
| 表頭 | 表頭 |
| ---- | ---- |
| 單元格 | 單元格 |
| 單元格 | 單元格 |
很多教程,都會遺忘一點,什么叫正則實例,首先要弄清正則對象
var reg = /\d+/;
//使用dir函數,來查看reg的類型
console.dir(reg)
查看輸出結果,完全的了解正則對象
其他三個函數,比較簡單吧,這里主要研究 exec方法
首先,語法和中文意思:
reg.exec(str) 就是正則對象,去捕獲一個字符串,返回一個數組,數組包含四部分,還是打印一下吧。哦,還是看別人寫的優秀教程吧。
exec
: 正則捕獲
每一次捕獲的時候,都是先進行默認的匹配,如果沒有匹配成功的,捕獲的結果是null;只有有匹配的內容,我們才能捕獲到,捕獲到的內容是一個數組。
捕獲的內容格式
- 捕獲的內容是一個數組。
數組中的第一項是當前大正則捕獲的內容。
index
: 捕獲內容在字符串中開始的索引位置。
input
: 捕獲的原始字符串。
var reg = /\d+/;
var str = "derrickrose";
var res = reg.exec(str);
console.log(res); // null
var str = "derrick20rose21";
var res = reg.exec(str);
console.log(res); // [0:"20", index:7, input: "derrick20rose21"]
console.log(reg.lastIndex); // 0
// 第二次通過exec捕獲的內容還是第一個內容
var res = reg.exec(str);
console.log(res); // [0:"20", index:7, input: "derrick20rose21"]
console.log(reg.lastIndex); // 0, 說明第二次捕獲的時候也是從字符串索引0處開始查找的
正則捕獲的特點
- 懶惰性 -> 每一次執行exec,只捕獲第一個匹配的內容,在不經過任何處理的情況下,在執行多次捕獲后,匹配的還是第一個內容。
lastIndex
: 是正則每一次捕獲在字符串中開始查找的位置,默認值是0。 - 如何解決懶惰型?-> 在正則的末尾加一個修飾符 "g"。
修飾符: g, i, m:
global(g)
: 全局匹配。
ignoreCase(i)
: 忽略大小寫匹配。
multiline(m)
: 多行匹配。
原理: 加了全局修飾符"g",正則每一次捕獲結束后,lastIndex的值都變為了最新的值,下一次捕獲從最新的位置開始查找,這樣就可以把所有需要捕獲的內容都獲取到了。
var reg = /\d+/g;
var str = "derrick20rose21";
console.log(reg.lastIndex); // 0
console.log(reg.exec(str)); // ["20..
console.log(reg.lastIndex); // 9
console.log(reg.exec(str)); // ["21..
console.log(reg.lastIndex); // 15
console.log(reg.exec(str)); // null
- 自己編寫程序,獲得正則的所有內容,注意,一定不要忘記加 "g"。
var reg = /\d+/g;
var str = "derrick20rose21";
var ary = [];
var res = reg.exec(str);
while (res) {
ary.push(res[0]);
res = reg.exec(str);
}
console.log(ary);
- 貪婪性:正則每一次捕獲都是按照都是按照最長的結果來捕獲的,例如2符合正則,20也符合正則,但是默認的捕獲的是20。
var reg = /\d+/g; // -> 出現1到第一個0-9之間的數字
var str = "derrick20rose21";
console.log(reg.exec(str)); // ["20".....]
- 如何解決正則的貪婪性 -> 在量詞元字符后面添加一個 ? 即可。
? 在正則中有很多的作用:
放在一個普通的元字符后面,代表出現0-1次 /\d?/ 出現0-1次數字 -> 數字可能出現也可能不出現。
放在一個量詞元字符后面是取消捕獲時候的貪婪性。
var reg = /\d+?/g;
var str = "derrick20rose21";
console.log(reg.exec(str)); // ["2".....]
var ary = [];
var res = reg.exec(str);
while (res) {
ary.push(res[0]);
res = reg.exec(str);
}
console.log(ary);
字符串中的match方法 -> 把所以和正則匹配的字符都獲取到。
var reg = /\d+?/g;
var str = "derrick20rose21";
var ary = str.match(reg);
console.log(ary);
雖然在當前的情況下,match比exec更加簡潔,但是match中存在一些自己處理不了的問題: 在分組捕獲到情況下,match只能捕獲到大正則匹配的內容,而對於小正則捕獲的內容是無法獲取的。
分組捕獲
正則分組:
- 改變優先級
- 分組引用
// \2 代表和第二個分組出現一模一樣的內容
// \1 代表和第一個分組出現一模一樣的內容
// 一模一樣: 和對應的分組中的內容的值都要一樣
var reg = /^(\w)\1(\w)\2$/;
console.log(reg.test("zzff")); // -> true
console.log(reg.test("z0f_")); // -> false
- 分組捕獲 -> 正則在捕獲的時候,不僅僅把大正則匹配的內容捕獲到,而且還可以把小分組匹配的內容捕獲到。
(?:)
在分組中,?: 的意思是只匹配不捕獲。
var reg = /^(\d{2})(\d{4})(\d{4})(\d{2})(?:\d{2})(\d)(?:\d|X)$/;
var str = "122726188803810391";
console.log(reg.exec(str)); // -> ary = ["122726188803810391",...]
// 數組中的第一項ary[0]: 大正則匹配的內容
// ary[1]: -> 第一個分組捕獲的內容
// ary[2]: -> 第二個分組捕獲的內容
// ...
console.log(str.match(reg)); // -> match 和 exec獲取的結果是一樣的
var reg = /derrick(\d+)/g;
var str = "derrick20rose30derrick40";
// 用exec執行三次,每一次不僅僅把大正則匹配的獲取到,而且還可以獲取第一個分組匹配的內容
console.log(reg.exec(str));
console.log(reg.exec(str));
console.log(reg.exec(str));
// 而match只能捕獲大正則匹配的內容
console.log(str.match(reg));
作者:阿九是只大胖喵
鏈接:https://www.jianshu.com/p/6e77ac888147
來源:簡書