02.正則表達式

来源:https://www.cnblogs.com/oksana/archive/2020/03/06/12431237.html
-Advertisement-
Play Games

準備: —安裝RegExpBuddy軟體——專門測試正則表達式是否正確的軟體 —或是找一個正則表達式線上測試網站 1.正則表達式——Regular Expression 什麼是: 正則表達式,是專門描述字元串中字元出現規則的表達式。 為什麼: 因為程式不認識人類語言中的辭彙,所以才需要程式員用正則表 ...


準備:

—安裝RegExpBuddy軟體——專門測試正則表達式是否正確的軟體

—或是找一個正則表達式線上測試網站

1.正則表達式——Regular Expression

什麼是:

  正則表達式,是專門描述字元串中字元出現規則的表達式。

為什麼:

  因為程式不認識人類語言中的辭彙,所以才需要程式員用正則表達式教程式認識人類語言中的辭彙。

可用於:

  1.驗證字元串格式

  2.查找敏感詞

定義正則表達式:

  (1).普通字元

   所有的單個大小寫字母、數字都是一個正則表達式,用以匹配單個字元,這個字元與它本身相同,簡單來講,就是一個關鍵詞原文。

   —例如:"我是"

  

關鍵詞匹配的過程:

  

在RegExp Buddy中

—查找一句話中是否包含敏感詞“我是”

—如果將一句話中的“我是”,換成“我事”,還能查詢出來嗎?

(2).字元集

問題:

  第二個字元換成另一個同音字,就匹配不到了

解決:

  字元集

什麼是:

—字元集是規定一位字元上多種備選字的列表

—只要規則中某一位字元上有多種備選字時,就用字元集

如何:

  [備選字列表]

例如:

  匹配時,只要與[]中任意一個字元匹配,就算滿足規則

字元集匹配過程:

  

如果再連上前邊寫死的“我”字規則,可匹配種詞:

  

在RegExp Buddy中

—定義一個規則同時匹配“我是” ,“我事” ,“我時” 三種敏感詞

答案: [是時事]

—擴展:修改規則,使其進一步匹配“卧是”

答案: [我卧][是時事]

—[我卧][是事時]匹配過程: 

  

再例如:

常用手機號規則:

— 第一位:1

— 第二位:3、4、5、6、7、8、9中選其中一個

— 後 9位:每一位上都是在0~9數字之間任選其一

—結果:

  

問題:

  如果每個數字都寫很麻煩。

解決:

  簡寫:如果[]中部分備選字元連續,可以使用-省略中間字元

例如:

          手機號規則中:

[3456789] 可簡寫為 [3-9] 讀作 39

[0123456789] 可簡寫為 [0-9] 讀作 09

  所以,手機簡寫形式:

    1[3-8][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]

  

其它簡寫:

要匹配 一位小寫 字母 : [a-z]             26

要匹配 一位大寫 字母 : [A-Z]             26

要  匹  配 一 位 字 母 : [A-Za-z]        52

要匹配一位字母或數字:[0-9A-Za-z]    62

要  匹  配  一 位 漢 字:[\u4e00-\u9fa5]

                                 19968 ~ 40869  20902

使用字元集簡寫:

在RegExp Buddy中

  

—利用字元集簡寫定義車牌號規則:

— 第一位:1位漢字

— 第二位:1位大寫字母

— 第三位:·

— 後五位:每一位都是一位大寫字母或數字

答案:

  [\u4e00-\u9fa5][A-Z]·[0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z]

 

(3).預定義字元集

正則表達式語法為四種最常用的字元集定義了最簡化寫法,稱為預定義字元集。

包括:

要  匹  配  一  位  數 字  : \d   等效於   [0-9]  

要匹配一位字母、數字或_:  \w   等效於   [0-9A-Za-z_]

要  匹 配 一 位 空 字  符 :\s    可匹配  空格、製表符、Tab等空白

要匹配所有文字 (通配符) : .  

所以,利用預定義字元集簡寫手機號規則為:

  1[3-8]\d\d\d\d\d\d\d\d\d

  

問題:  

  手機號規則中\d寫了9遍,車牌號規則中[0-9A-Z]也寫了五遍,也很不方便。

原因:

  一個字元集(\d[0-9])只能匹配一位字元,要匹配9位字元,就必須重覆寫9遍。

  程式用規則匹配字元串,就像彩票兌獎一樣,是逐字逐個規則匹配。

  不但內容要符合規則,位數首先要一致。

  [\u4e00-\u9fa5][A-Z]·[0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z]

解決:

  使用數量詞。

(4).數量詞

什麼是:

  數量詞,是專門規定一個字元集出現次數的規則

何時:

  今後,只要一個字元集在規則中可能連續反覆出現多次,就要用數量詞以簡寫方式定義出現次數。

如何:

  數量詞緊跟在其修飾的字元集之後,預設修飾相鄰的前一個字元集

例如:

  利用數量詞進一步簡寫手機號規則中,可進一步簡寫為:

     1[3-8]\d{9}     \d{9} 相當於 \d*9次

     

使用數量詞:

利用數量詞進一步簡寫車牌號規則,可進一步簡寫為:

   [\u4e00-\u9fa5][A-Z]·[0-9A-Z]{5}

   

問題:

  接收簡訊驗證碼時,網站驗證碼有時4位,有時6位,並不確定,怎麼辦?

其實,數量詞包括兩大類:

1). 有明確數量邊界的數量詞

字元集{n}      表示字元集必須重覆n次,不能多也不能少

例如:

  \d{4,6}  表示4位數字

  

字元集{n,m}   表示字元集至少重覆n次,最多重覆m次,

例如:  

  \d{4,6}   表示4到6位數字

  

      字元集{n,}     表示字元集匹配的內容至少重覆n次,多了不限

  例如:

    \d{6,}     表示6位以上數字

    

2). 沒有明確數量邊界的數量詞

    表示可有可無,多了不限

    \s*

    

+  表示至少一次,多了不限

  \s+ 

  

?  表示可有可無,最多一次

  \s?

  

在RegExp Buddy中

—匹配手機簡訊中的驗證碼:連續的4~6位數字

答案: \d{4,6}

—匹配字元串中的一組連續空字元

答案: \s+

(5).選擇和分組

問題:

  屏蔽敏感詞時,輸入者把字換成拼音就查不出來了

錯誤的做法:

  直接將拼音放入[]中作為字元集中的備選

  比如:

    [cao]

    

希望:

  草 或 cao

  

原因:

  字元集只認識單個字,不認識一組拼音

  

正確做法:

  1).選擇

什麼是:

  選擇,是指在多個子規則中選其一匹配

何時:

  今後,只要在多個子規則中選其一匹配時,就用選擇

如何:     

  子規則1   |   子規則2  

讀作:  

  滿足規則1    滿足規則2

例如:

  草 | cao

問題:

  如果規則寫成“我草|cao” 呢?

希望是:

  我草 cao

  

實際卻是:

  我草 | cao

  

原因:

因為“|”選擇符只分左右,不考慮單個字元  

解決:

使用分組。

2).分組

什麼是:

  分組,將多個子規則視為一組,再和分組外的規則匹配

何時:

  只要希望將多個子規則視為一個整體,再和其它規則匹配時,就用分組

如何:

  其它規則(多個子規則)

例如:

  —匹配一個“草” 字或“cao”這個拼音

  答案: |cao

  

  —匹配“我草”或“我cao

答案: (|cao)

使用選擇和分組:

問題1:

  同時驗證敏感字同音字或拼音,我草、我艹、我cao、我槽

答案:我 ([草艹槽]|cao)

問題2:

  “我” 字也可能是“卧”或“wo

  答案:([我卧]|wo)([草艹槽]|cao)

  

問題3:

  可能在中間加不確定個數的空字元:

答案:([我卧]|wo)\s*([草艹槽]|cao)

在RegExp Buddy中定義規則

—匹配“我草”

  

—匹配 “卧    槽”

  

—匹配wocao”,“我  草”等敏感詞

  

—定義完整手機號規則:

          分析:

+86或0086:(\+86|0086)

至少一個空字元 : \s+

之前所有,整體可有可無,最多一次: ()?

1

3~9

任選其一 9位數字

  答案: ((\+86|0086)\s+)?1[3-8]\d{9}

  

—定義完整身份證號規則:

分析:

    15位數字: \d{15}    (一代身份證)

    2位數字:  \d\d

    最後一位: 1位數字或Ⅹ:   [0-9Ⅹ]

    最後三位 可有可無,最多一次 (最後三位)?

答案:\d{15}(\d\d[0-9x])?

    

(6).指定匹配位置

一個字元串中三個位置比較特殊:

—1. 字元串開頭

—2. 字元串結尾

—3. 英文句子中的每個單詞中間的空白位置

  

如果只希望匹配特殊位置上的關鍵詞時,就可用特殊符號表示特殊位置。

包括:

—1. ^ 表示字元串開頭

—2. $ 表示字元串結尾

—3. \b 表示單詞邊界,可匹配:空格,標點符號,字元串開頭和結尾等可將一個單詞與其它單詞分割開的符號。

  

例如:

  匹配一組連續的空字元

—1. 匹配任意一組連續的空字元

  

—2. 僅匹配開頭的空字

  

—3. 僅匹配結尾的空字元

  

—4. 同時匹配開頭和結尾的空字元:

  錯誤的做法:

     ^\s+$,表示從開頭到結尾之間只能是空字元!

    

      正確做法:

        |”選擇符,將整個規則強行一分為2

        

再比如:

  找到每個單詞首字母

    —前邊緊挨著單詞邊界的字母

      

附圖片(不與博客內容匹配,僅參考):

  

  

  

  

  

  

英文單詞整理
Regular  Expression 正則表達式
Regular            規則
Expression       表達式 做一件事的一條程式的語句
\d    digit         (從 0 到 9 的任何一個)數字,數位
\s    space       (可利用的)空地,空間;空格
\w   word         單詞;詞;字;
\b    boundary   邊界


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

-Advertisement-
Play Games
更多相關文章
  • 強制類型轉換 一、將其他數據類型轉換為string 法一:調用toString()方法 ​ 但null和undefined這兩個值沒有toString()方法 法二:調用String()函數 註: 調用xxx的yyy()方法,就是xxx.yyy(); ​ 調用xxx的yyy函數,就是xxx(); 二 ...
  • 定位 可通過position屬性還設置元素的定位。 ​可選值:static 預設值 沒開啟 ​ relative 開啟相對定位 ​ absolute 開啟絕對定位 ​ fixed 開啟固定定位(絕對定位的一種) 開啟定位後可通過left、right、top、bottom四個屬性來設置元素偏移量。 l ...
  • 文檔流 1、元素在文檔流中的特點: ​ 塊元素:在文檔流中獨占一行;在文檔流中預設寬度是父元素的100%,預設高度是被內容撐開。 ​ 內聯元素:在文檔流中只占自身大小,如果一行不足以容納多個內聯元素就會換到下一行繼續從左向右排列; ​ 高度是被內容撐開的。 2、元素脫離文檔流後,高度寬度都被內容撐開 ...
  • 盒子模型 盒子模型的四個部分:內容區、邊框,內邊距,外邊距;前三者共同決定盒子可見框的大小。 邊框 為元素設置邊框 .box1{ width:100px; height:100px; background-color red; /*設置盒子內容區寬高及顏色。*/ border-width:10px; ...
  • 創作不易,轉載請註明出處!!! 效果 修改:ext-extend.js源碼 在最後面添加3行,重寫方法 代碼拷貝區 Ext.override(Ext.ux.grid.GridFilters, { menuFilterText: "篩選" }); Ext.override(Ext.ux.grid.fi ...
  • html標簽(也叫元素)大概可以統分為三大類,塊元素、內聯元素、內聯塊元素。 塊元素 1,常用的塊元素:ul、li、div、p、dl、dt、dd、h1~h6。 2,塊元素支持所有的樣式。 3,盒子獨占據一行,即使設置了寬度。 4,如果沒有設置寬度,預設寬度為父元素的100%。 內聯元素 1,常用的內 ...
  • 獲取當前地圖的行政區 getCity() <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>map</title> <script type="text/javascript" src="https://web ...
  • 在網頁中元素有三種佈局模型:1.流動模型(Flow)2.浮動模型 (Float)3.層模型(Layer),如何讓html元素在網頁中精確定位?通過css定位屬性position來支持層佈局模型=>層模型有三種形式:1.絕對定位(position: absolute)2.相對定位(position: ... ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...