js正則捕獲exec和match,正則檢測test,正則替換replace,四者全解析


首先用一張表來總說對比

注: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;只有有匹配的內容,我們才能捕獲到,捕獲到的內容是一個數組。

捕獲的內容格式

  1. 捕獲的內容是一個數組。
    數組中的第一項是當前大正則捕獲的內容。
    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處開始查找的

正則捕獲的特點

  1. 懶惰性 -> 每一次執行exec,只捕獲第一個匹配的內容,在不經過任何處理的情況下,在執行多次捕獲后,匹配的還是第一個內容。
    lastIndex: 是正則每一次捕獲在字符串中開始查找的位置,默認值是0。
  2. 如何解決懶惰型?-> 在正則的末尾加一個修飾符 "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
  1. 自己編寫程序,獲得正則的所有內容,注意,一定不要忘記加 "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);
  1. 貪婪性:正則每一次捕獲都是按照都是按照最長的結果來捕獲的,例如2符合正則,20也符合正則,但是默認的捕獲的是20。
    var reg = /\d+/g; // -> 出現1到第一個0-9之間的數字
    var str = "derrick20rose21";
    console.log(reg.exec(str)); // ["20".....]
  1. 如何解決正則的貪婪性 -> 在量詞元字符后面添加一個 ? 即可。
    ? 在正則中有很多的作用:
    放在一個普通的元字符后面,代表出現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只能捕獲到大正則匹配的內容,而對於小正則捕獲的內容是無法獲取的。


分組捕獲

正則分組:

  1. 改變優先級
  2. 分組引用
    // \2 代表和第二個分組出現一模一樣的內容
    // \1 代表和第一個分組出現一模一樣的內容
    // 一模一樣: 和對應的分組中的內容的值都要一樣
    var reg = /^(\w)\1(\w)\2$/;
    console.log(reg.test("zzff")); // -> true
    console.log(reg.test("z0f_")); // -> false
  1. 分組捕獲 -> 正則在捕獲的時候,不僅僅把大正則匹配的內容捕獲到,而且還可以把小分組匹配的內容捕獲到。
    (?:) 在分組中,?: 的意思是只匹配不捕獲。
    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
來源:簡書

關於正則分組和捕獲 建議參考 https://www.cnblogs.com/ljhdo/p/10678281.html

正則表達式 第三篇:分組和捕獲


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM