Java 正則?:?=?!的理解

来源:https://www.cnblogs.com/pan1042/archive/2019/12/30/12121382.html
-Advertisement-
Play Games

上圖是官方文檔的介紹,總結一下講了兩個知識點 ①是否獲取匹配並保存匹配的值、②正向預查和反向預查。 1:解釋是否獲取匹配並保存匹配的值 ()表示捕獲分組,獲取匹配,()把每個分組裡的匹配的值保存起來 (?:)表示非捕獲分組,獲取匹配,非捕獲分組匹配的值不會保存起來,可以提高程式執行速度 (?=?!? ...


  上圖是官方文檔的介紹,總結一下講了兩個知識點 ①是否獲取匹配並保存匹配的值、②正向預查和反向預查。

1:解釋是否獲取匹配並保存匹配的值

  1. ()表示捕獲分組,獲取匹配,()把每個分組裡的匹配的值保存起來
  2. (?:)表示非捕獲分組,獲取匹配,非捕獲分組匹配的值不會保存起來,可以提高程式執行速度
  3. (?=?!?<=?<!)表示非捕獲分組,不獲取匹配,也不保存匹配的值

舉例說明:

// 是否獲取匹配
測試文本 abxoxcd
..(xox).. 匹配 abxoxcd
..(
?:xox).. 匹配 abxoxcd ..(?=xox).. 匹配 abxo

獲取匹配,一般匹配到了字元之後,該字元就被消耗、輸出。不獲取匹配,不會消耗字元。

// 是否保存匹配的值 測試文本 AAABBCaaA E666FF (A)\\1* 匹配 AAA、A (\\w)\\1+ 匹配 AAA、BB、aa、666、FF (?:A)(B)\\1* 匹配 ABB

因為非捕獲分組不保存匹配的值,所以  (?:A)(B)\\1* 匹配 ABB 第一個\\1表示(B)這個捕獲組捕獲到的值。  “註意:反向引用表示捕獲到的值,而不是再次使用正則表達式”

這裡用到了一個新的知識點,反向引用。
  

  1、正則表達式中  “\number” 表示反向引用,表示引用一個捕獲組,需要和小括弧 “()” 一起使用

  2、正則捕獲組的下標從 0 開始,下標為 0 的組是整個表達式,下標為 1 的表示從左到右開始的第一個左括弧所包含的值,後面的數字以此類推

  3、捕獲組在匹配成功時,會將子表達式匹配到的內容,保存到記憶體中一個以數字編號的組裡,可以簡單的認為是對一個局部變數進行了賦值,這時就可以通過反向引用的方式,引用這個局部變數的值。

  4、反向引用必須要與捕獲組一同使用,如果沒有捕獲組,而使用了反向引用的語法,不同語言的處理方式不一致,有的語言會拋異常,有的語言會當作普通的轉義處理

2:解釋正向預查和反向預查

// 前瞻:
exp1(?=exp2)   查找exp2前面的exp1
// 後顧:
(?<=exp2)exp1  查找exp2後面的exp1
// 負前瞻:
exp1(?!exp2)   查找後面不是exp2的exp1
// 負後顧:
(?<!exp2)exp1  查找前面不是exp2的exp1

舉例說明:

// 正向預查和反向預查
測試文本 abxoxcd

  ..(?=xox)  匹配 ab

  ..(?=oxo)  匹配不到

(?=xox).. 匹配xo (
?<=xox).. 匹配 cd

預查只需要記住:1、環顧全局定位到非捕獲組;2、不獲取匹配(不消耗字元),不保存匹配的值(不能使用反向引用)

加餐

提問:強密碼(必須包含數字、小寫字母和大寫字母三種字元,即這三種字元的組合,且不能使用特殊字元,長度在8-16之間),你認為必須是 1個數字+1個小寫字母+1個大寫字母 這種順序嗎?

 ^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])[0-9a-zA-Z]{8,16}$ 

(?=.*[0-9])表示任意字元+一個數字

(?=.*[a-z])表示任意字元+一個小寫字母

  (?=.*[A-Z])表示任意字元+一個大寫字母

  [0-9a-zA-Z]{8,16}表示8-16個數字、大小寫字母

當有多個正向預查規則時它們是併列的,不是串列的

舉例說明:

測試文本 abc2abc

  \\d(?=a)(?=b)  匹配不到

  \\d(?=a)(?=.b) 匹配 2   當然這是為了演示它的規則,其實可以寫 \\d(?=ab)

這裡主要的原因是:不獲取匹配(不消耗字元)。

對於 ^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])[0-9a-zA-Z]{8,16}$ 
其實整個正則表示可以分為三部分:
/^(?=.*[0-9])[0-9a-zA-Z]{8,16}$/
/^(?=.*[a-z])[0-9a-zA-Z]{8,16}$/
/^(?=.*[A-Z])[0-9a-zA-Z]{8,16}$/
待匹配字元串必須同時滿足這三部分才可以


【參考】

  1. https://www.jianshu.com/p/9c4979a3b7e4
  2. http://www.45fan.com/article.php?aid=19101105382209663550874595
  3. https://www.runoob.com/java/java-regular-expressions.html
  4. https://www.runoob.com/regexp/regexp-syntax.html
  5. https://www.cnblogs.com/archermeng/p/7537244.html
 

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

-Advertisement-
Play Games
更多相關文章
  • 一、add 將傳進來的參數添加到原來的值上面。這個過濾器會嘗試將“值”和“參數”轉換成整形然後進行相加。如果轉換成整形過程中失敗了,那麼將會將“值”和“參數”進行拼接。如果是字元串,那麼會拼接成字元串,如果是列表,那麼會拼接成一個列表。實例代碼如下: {{ value|add:"2"}} 如果val ...
  • Composer 是新一代的PHP依賴管理工具。本文介紹使用Composer的五個小技巧,希望能給你的PHP開髮帶來方便。 1. 僅更新單個庫 只想更新某個特定的庫,不想更新它的所有依賴,很簡單 composer update foo/bar 此外,這個技巧還可以用來解決“警告信息問題”。你一定見過 ...
  • 本篇文章主要介紹了PHP組件、框架以及Composer,具有一定的學習價值,感興趣的朋友可以瞭解一下。 什麼是組件 組件是一組打包的代碼,是一系列相關的類、介面和Trait,用於幫助我們解決PHP應用中某個具體問題。例如,你的PHP應用需要收發HTTP請求,可以使用現成的組件如guzzle/guzz ...
  • Composer是一個非常流行的PHP包依賴管理工具,已經取代PEAR包管理器,對於PHP開發者來說掌握Composer是必須的. 對於使用者來說Composer非常的簡單,通過簡單的一條命令將需要的代碼包下載到vendor目錄下,然後開發者就可以引入包並使用了. 其中的關鍵在於你項目定義的comp ...
  • 原先在《演算法競賽入門經典》看過這題,當時沒想出來選擇百度。結果洛谷再次跳出來了。很尷尬,忘了做題方法的我繼續百度。重做了一遍,很慚愧 1 #include <stdio.h> 2 #include <string.h> 3 int main(void) 4 { 5 int a, b; 6 int s ...
  • 【編寫程式,輸人一個大於2的自然數,然後輸出小於該數字的所有素數組成的列表。】所謂素數,是指除了1和自身之外沒有其他因數的自然數,最小的素數是2,後面依次是3、5、7、11、13... c++代碼: #include<iostream> #include<bits/stdc++.h> #define ...
  • 本節通過硬體描述語言Verilog HDL對二十進位編碼器的描述,介紹Verilog HDL程式的基本結構及特點。 二十進位編碼器及Verilog HDL描述 二十進位編碼器是數字電路中常用的電路單元,它的輸入是代表0~9這10個輸入端的狀態信息。輸入信號為高電平時,輸出相應的BCD碼,因此也稱為1 ...
  • 官網提示是這樣的,對/e修飾符的支持已刪除。請改用preg_replace_callback()原因是/e 修正符使 preg_replace() 將 replacement 參數當作 PHP 代碼(在適當的逆向引用替換完之後),會被一句話後門使用 看看smarty中是也是這樣用的,也是存在問題$s ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...