徹底理解正則

来源:https://www.cnblogs.com/sqh17/archive/2019/02/12/10242223.html
-Advertisement-
Play Games

在此之前的項目開發中,發現利用正則方法能夠提高開發效率,所以看著教程和博客,自己重新學習了一遍正則,並記錄下來。 正則聲明 構造函數聲明方式 字面量聲明方式 tip:參數解釋: pattern:模式,要匹配的內容。 modifiers:修飾符 i:ignore。不區分大小寫的匹配 g:global。 ...


在此之前的項目開發中,發現利用正則方法能夠提高開發效率,所以看著教程和博客,自己重新學習了一遍正則,並記錄下來。

正則聲明

  • 構造函數聲明方式
    var pat = new RegExp(pattern,modifiers);
  • 字面量聲明方式
    var pat = /pattern/modifiers
  • tip:參數解釋
    pattern:模式,要匹配的內容。
    modifiers:修飾符
    • i:ignore。不區分大小寫的匹配
    • g:global。全局匹配
    • m:多行匹配
      ps:這三個可以連用,無順序之分。
    var reg = new RegExp('abc','ig'); // 代表不區分大小寫並且全局匹配abc。
    var reg = /abc/m  // 代表多行匹配abc。

正則字元

  • ^ 表示匹配輸入字元串的開始位置
    ^abc => 代表整個字元中匹配首個字元串為abc的
  • $ 表示匹配輸入字元串的結束位置
    abc$ => 代表整個字元中匹配尾部字元串為abc的
  • . 表示匹配換行符\n之外的任何字元
    . <=> \w\d\r\f\t\v
    ps:[.] 這種模式代表只匹配.字元,等價於'.'
  • [] 表示字元集合。匹配所包含的任意一個字元
    [abc] => apple也符合[abc]中的a
    [abcdef] => football也符合[abcdef]的a,b,f
    [^abc] => 代表不包含abc的任何字元都可匹配
    ps: ^abc與[^abc]的區別:
    • ^abc 代表整個字元中匹配首個字元串為abc的
    • [^abc] 代表不包含abc的任何字元都可匹配
  • {} 表示匹配字元的數量,量詞
    a{2} => 代表匹配確定a只能出現兩次
    • {n} 匹配確定的n次
      a{2} => 代表匹配確定a只能出現兩次 aa
    • {n,} 表示至少匹配n次
      a{2,} => 代表匹配確定a至少出現兩次 aa,aaa,aaaa
    • {m,n} 表示最少出現m次,最多出現n次
      a{2,4} => 代表匹配確定a最少出現2次,最多出現4次 aa,aaa,aaaa
  • | 表示或的關係,兩者都可匹配
    a|b => 代表a和b都可以匹配到
  • () 表示分組符,一代表匹配裡面的字元並獲取這一匹配。二代表優先順序
    (partten) => 匹配pattern並獲取這一匹配
    ^(0|[1-9][0-9]*)$ => 代表零和非零開頭的數字
    ps:(?:pattern) => 匹配pattern但不獲取匹配結果。
  • + 表示前面的字元必須至少出現一次(1次或多次)
    a+bc <=> abc | aabc | aaabc
    ps:+ 等價於 {1,}
  • * 表示字元可以不出現,也可以出現1次或多次
    a*bc <=> bc | abc | aabc
    ps: * 等價於 {0,}
  • ? 表示前面的字元最多只可以出現一次(0次或1次)
    a?bc <=> bc | abc

常用字元和非列印字元

  • \d 匹配一個數字字元
    \d 等價於 [0-9] (\d <=> \[0-9\])
  • \D 匹配一個非數字字元
    \D 等價於 [^abc] (\D <=> \[^0-9\])
  • \w 匹配字母,數字,下劃線
    \w <=> \[A-Za-z0-9_\]
  • \W 匹配非字母,數字,下劃線
    \W <=> \[^A-Za-z0-9_\]
  • \b 匹配一個單詞邊界,也就是單詞和空格間的位置
  • \B 匹配一個非單詞邊界
    eg: /ter\b/ => 可匹配chapter,不能匹配terminal
  • \n 換行符
  • \r 回車符
  • \f 換頁符
  • \t 製表符
  • \v 垂直製表符
  • \s 匹配任何空白字元,包括空格,製表符,換頁符
    \s <=> \[\f\n\v\t\r\]
  • \S 匹配任何非空白字元
    \S <=> \[^\f\n\r\v\t\]

正則方法

var reg = new RegExp()
var str = 'abc'; typeof str == 'string'

  • reg.test(str); 用來測試某個字元串是否與正則匹配,返回值是一個布爾值,匹配為true,不匹配為false。

      var reg = /^a?b+c*/
      var str1 = 'aabbcc'
      var str2 = 'bc'
      reg.test(str1) // false  ?代表的是最多出現一次
      reg.test(str2) // true 
  • reg.compile(str) 能夠對正則表達式進行編譯,方便多次調用,提高性能。參考菜鳥教程的說法:該方法可以編譯指定的正則表達式,編譯之後的正則表達式執行速度將會提高,如果正則表達式多次被調用,那麼調用compile方法可以有效的提高代碼的執行速度,如果該正則表達式只能被使用一次,則不會有明顯的效果。

      var str="Every man in the world! Every woman on earth!";
      patt=/man/g;
      str2=str.replace(patt,"person");
      console.log(str2); // Every person in the world! Every woperson on earth!
    
      patt=/(wo)?man/g;
      patt.compile(patt);
      str2=str.replace(patt,"person");
      console.log(str2); // Every person in the world! Every person on earth!
  • reg.exec(str) 接受一個字元串,返回一個數組,否則返回null。
    返回值是數組 解釋:
    1 如果有多個匹配的話
           1 此數組的第0個元素是與正則表達式相匹配的文本。
           2 第一個元素是與reg的第一個子表達式相匹配的文本,(如果有的話)
           3 第二個元素是reg的第二個子表達式相匹配的文本,(如果有的話)
           4……
    2 index 匹配文本的第一個字元的索引
    3 input 是被檢索的字元串str

      var str = '2018ceshi2019'
      var reg = /(\d)(\w)/;
      var result = reg.exec(str)
      console.log(result);//["20", "2", "0", index: 0, input: "2018ceshi2019"]
      var str = 'The Quick Brown Fox Jumps Over The Lazy Dog'
      var reg = /quick\s(brown).+?(jumps)/ig;
      var result = reg.exec(str);
      console.log(result); //  ["Quick Brown Fox Jumps", "Brown", "Jumps", index: 4, input: "The Quick Brown Fox Jumps Over The Lazy Dog", groups: undefined]
      // result [0] 匹配的全部字元串 'Quick Brown Fox Jumps' 
      //        [1],[2],...[n] 括弧中的分組捕獲 [1] = Brown [2] = Jumps 
      //        index :匹配到的字元位於原始字元串的基於0的索引值 4
      //        input : 原始字元串 The Quick Brown Fox Jumps Over The Lazy Dog
    ps:如果不需要捕獲分佈的內容,則在不需要分組捕獲裡面加上?:,此表示匹配不捕獲。
    var reg = /quick\s(?:brown).+?(?;jumps)/ig; 這樣就不會有[1],[2],...[n]的分組捕獲了。
  • str.match(reg) 在字元串中搜索符合規則的內容,成功則返回數組內容,失敗則返回null

      var str = 'abc123def45g6hijkl789';
      var reg1 = /\d+/g;   // 每次匹配至少一個數字  且全局匹配
      console.log( str.match(reg1));   // [123,45,6,789]
      var reg2 = /\d+/;
      console.log(str.match(reg2)); // ["123", index: 3, input: "abc123def45g6hijkl789", groups: undefined]
      var reg3 = /\d/;
      console.log(str.match(reg3));//["1", index: 3, input: "abc123def45g6hijkl789", groups: undefined]
      var reg4 = /\d/g;
      console.log(str.match(reg4)) // ["1", "2", "3", "4", "5", "6", "7", "8", "9"]
    由這四個例子可知,全局匹配,得出的結果是一個數組,如果不是全局匹配,當找到數字123,它就會停止了。就只會彈出123,類似與exec()的結果。加上全局匹配,就會從開始到結束一直去搜索符合規則的。如果沒有加號,匹配的結果就是["1", "2", "3", "4", "5", "6", "7", "8", "9"],有了加號,每次匹配的數字就是至少一個了。
  • str.search(reg) 在字元串中搜索符合正則內容的索引,如果不存在,則返回-1。

      var str = 'abcdefg';
      var reg1 = /B/i;
      console.log(str.search(reg1)) // 1
      var reg2 = /B/;
      console.log(str.search(reg2)) // -1 
  • str.replace(reg,new str/callback)
    參數解釋: 第一個參數reg:要匹配的正則內容,
    第二個參數new str/callback。callback,回調函數里也有三個參數:1 匹配的字元,2 匹配字元的索引,3 源字元串。

      var str = '我愛北京天安門,天安門上太陽升'
      var reg = /北京|天安門/g
      console.log(str.replace(reg,'*')) // 我愛**,*上太陽升
      var str = "我愛北京天安門,天安門上太陽升。";
      var re = /北京|天安門/g;  //  找到北京 或者天安門 全局匹配
      var str2 = str.replace(re,function(str){
          console.log(str); //用來測試:函數的第一個參數代表每次搜索到的符合正則的字元,所以第一次str指的是北京 第二次str是天安門 第三次str是天安門
          var result = '';
          for(var i=0;i<str.length;i++){
              result += '*';
          }              
          return result; //所以搜索到了幾個字就返回幾個* 
      });
      console.log(str2)  //我愛*****,***上太陽升 

額外例子:

  • 1 找重覆項最多的字元個數

      var str = 'aibbicidhdieifigbdihdaii';
      var arr = str.split(''); //把字元串轉換為數組
      str = arr.sort().join(''); //首先進行排序,這樣結果會把相同的字元放在一起,然後再轉換為字元串
      console.log(str);  // aabbbcddddefghhiiiiiiiii
      var value = '';
      var index = 0;
      var re = /(\w)\1+/g;  //匹配字元,且重覆這個字元,重覆次數至少一次。
      str.replace(re,function($0,$1){
          console.log($0);   //代表每次匹配成功的結果 : aa dd jj kk l sssssssssssssssss
          console.log($1);  //代表每次匹配成功的第一個子項,也就是\w:  a d j k l S
          if(index<$0.length){  //如果index保存的值小於$0的長度就進行下麵的操作
              index = $0.length;  // 這樣index一直保存的就在最大的長度
              value = $1;  //value保存的是出現最多的這個字元
          }
    
      });
      console.log('最多的字元:'+value+',重覆的次數:'+index);  // 最多的字元:i,重覆的次數:9
  • 大寫數字替換小寫數字

      var str = "2019";
      var a = ["零","壹","貳","叄","肆","伍","陸","柒","捌","玖"];
      str = str.replace(/\d/g, function () {
          return a[arguments[0]];
      });
      console.log(str);//貳零壹玖

    結尾

    通過學習正則,發現正則不是很難,主要是因為沒有往正則方面去想,正則無非就是幾個字元加上方法就能匹配自己想要匹配的結果,在於嘗試,嘗試多了,自然而然就學會合理在項目中使用正則。
    以上是我學習正則記錄的筆記,我把筆記整理到了github上了,歡迎閱讀,好的話給個star。大家如果覺得我有什麼做的不對的,請下方評論或私信,一起進步加油!

    參考資料


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 要說程式如何從簡單走向複雜, 線程的引入必然功不可沒, 當我們期望利用線程來提升程式效能的過程中, 處理線程的方式也發生了從原始時代向科技時代發生了一步一步的進化, 正如我們的Elisha大神所著文章[The Evolution of Android Network Access](https://... ...
  • javascript提供stringA.localeCompare(stringB)方法,來判斷一個字元串stringB是否排在stringA的前面。 返回值: 如果引用字元存在於比較字元之前則為負數; 如果引用字元存在於比較字元之後則為正數; 相等的時候返回 0 。 返回一個數字表示是否 引用字元 ...
  • 原生態Ajax提交表單:需要藉助XMLHttpRequest對象的open,要收通過post發送請求還要setRequsetHeader,然後把數據發送給後端,代碼如下 目錄結構 index.py代碼 1 #index.py 2 #!/usr/bin/env python 3 #-*- coding ...
  • 數組綁定class的問題 版本:v1.5.4 自定義了一個icon的組件,部分代碼如下 export default { props: { name: { type: String, default: 'iconfont' }, icon: { type: String }, color: { ty ...
  • 本文由雲+社區發表 作者:嘿嘿嘿 可能大家都知道,js執行會阻塞DOM樹的解析和渲染,那麼css載入會阻塞DOM樹的解析和渲染嗎?接下來,我就來對css載入對DOM樹的解析和渲染的影響做一個測試。 為了完成本次測試,先來科普一下,如何利用chrome來設置下載速度 \1. 打開chrome控制台(按 ...
  • 棧(stack) 、堆(heap)、 隊列(queue)是js的三種數據結構。 棧(stack) 棧的特點是"LIFO,即後進先出(Last in, first out)"。數據存儲時只能從頂部逐個存入,取出時也需從頂部逐個取出。《前端進擊的巨人(一):執行上下文與執行棧,變數對象》中解釋執行棧時, ...
  • new 操作符 做了什麼 new 運算符創建一個用戶定義的對象類型的實例或具有構造函數的內置對象的實例。 假設 是一個構造函數,通常在創建對象的實例時,要使用 ,eg: , 那麼在調用 的時候,發生了什麼呢? 步驟如下: 1.一個繼承自 Test.prototype 的新對象被創建。可以理解為: 2 ...
  • 一、用jquery動態綁定點擊事件的寫法 部分代碼: ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...