Java 正則表達式【非貪婪匹配、格式驗證、反向引用、API】

非貪婪匹配

非貪婪匹配的元字符是問號 ??

當此字符跟在任何其他限定符(*、+、?、{n}、{m}、{n,m})之后,匹配模式是 "非貪心的"。非貪心的意思就是每次匹配搜索到的盡可能短的字符串,可以是0個

案例

對比貪婪匹配和非貪婪匹配

貪婪匹配

public static void main(String[] args) {String content  = "hello1010";Pattern pattern = Pattern.compile("\\d+");Matcher matcher = pattern.matcher(content);while (matcher.find()){System.out.println(matcher.group(0));}}

輸出結果:

1010

非貪婪匹配

public static void main(String[] args) {String content  = "hello1010";Pattern pattern = Pattern.compile("\\d+?");Matcher matcher = pattern.matcher(content);while (matcher.find()){System.out.println(matcher.group(0));}}

輸出結果:

1
0
1
0

正則表達式應用實例

對字符串進行如下格式驗證:

注意:格式驗證不同于普通的匹配,格式匹配通常使用字符匹配符、定位符和限定符三種來進行匹配,尤其是限定符(定位符?^ 、$),比如我們要判斷 "123456"是不是三位數,如果我們使用如下的正則表達式:

\\d{3}

運行結果:

123
456

但其實是不匹配的,所以我們需要加定位符:

^\\d\\d{2}$

意思就是匹配以一位數字為開頭,兩位數字為結尾的字符串。

下面為了避免重復代碼,我把模板放到這,只需要替換正則表達式的表達式即可。

        Pattern pattern = Pattern.compile("");Matcher matcher = pattern.matcher(content);if (matcher.find()){System.out.println("滿足格式");}

1、漢字

漢字的編碼為? \u0391 到 \uffe5。

^[\u0391-\uffe5]+$

2、郵政編碼

要求:是1~9開頭的一個六位數

^[1-9]\\d{5}$

3、QQ號碼

要求:是1-9開頭的一個(5-10位數)

^[1-9]\\d{4,9}$

4、手機號碼

必須 13,14,15,18 開頭的11位數。

我們可以使用小括號和豎線符號表示邏輯或,也可以使用中括號進行范圍表示。

^(13|14|15|18)\\d{9}$
//或者
^(1[3458])\\d{9}$

5、URL

URL 的匹配很重要,尤其是在網絡爬蟲中會經常用到。

https://blog.csdn.net/m0_64261982?spm=1000.2115.3001.5343

正則表達式:?

^((http|https)://)?([\w-]+\.)+[\w-]+(\/[\w-?=&/%#.]*)?$

注意:我們這里的正則表達式中的括號都是捕獲分組,如果希望不捕獲的話,可以在左半括號加一個問號?,這樣就成了非捕獲分組,非捕獲分組的內容不會保存到Matcher類中的groups數組中去,而捕獲分組的內容會保存到內存中,可以通過Matcher.group(int group)的方式從groups數組提取出來或者顯示命名的分組可以通過自定義的組名提取出來(詳細可以看我第二篇博客關于捕獲分組的部分)。?

System.out.println(matcher.group(0));    //https://blog.csdn.net/m0_64261982?spm=1000.2115.3001.5343
System.out.println(matcher.group(1));    //https://
System.out.println(matcher.group(2));    //https
System.out.println(matcher.group(3));    //csdn.
System.out.println(matcher.group(4));    ///m0_64261982?spm=1000.2115.3001.5343

其中:

^((https)://)?
https://這里用了非貪婪匹配,網址可以省去協議
([\\w-]+\\.)+[\\w-]+
blog.csdn.net
把帶 '.' 的用([\\w-]+\\.)+ 來匹配,后綴 .com或者 .net 這些用 [\\w-]+ 來匹配
(\\/[\\w-?=&/%#.]*)?$
m0_64261982?spm=1000.2115.3001.5343
后面主要處理的就是一些特殊符號,看情況增加

注意: [?.*] 中括號里的點和問號只代表本身 沒有特殊含義。

Pattern 類

之前我要做一些格式驗證的話需要寫很多代碼,其實我們可以直接使用Pattern類中的一個matches方法,它可以對傳入的正則表達式和字符串參數直接做一個整體匹配

比如,驗證QQ號:

        System.out.println(Pattern.matches("^[1-9]\\d{4,9}$","3493247023"));

這樣就可以極大地簡潔代碼,而不用去調用 Matcher 去一個個匹配。總之,Pattern.matches()適合做整體匹配,但不能做字符串中滿足某一正則表達式的所有子串的匹配,所以看情況使用。

Matcher 類

?這里介紹一些Matcher對象的其他方法。

我們以如下字符串為例:

小美喜歡小明,小明也喜歡小美。

start 和 end 方法

start 和 end 會輸出匹配到的字符串的下標

String content  = "小美喜歡小明,小明也喜歡小美。";Pattern pattern = Pattern.compile("喜歡");Matcher matcher = pattern.matcher(content);while (matcher.find()){System.out.println("=================");System.out.println(matcher.group(0));System.out.println(matcher.start());System.out.println(matcher.end());}

輸出:

=================
喜歡
2
4
=================
喜歡
10
12

replaceAll 方法

把滿足正則表達式的子串內容替換為參數的內容。

    String content  = "清華大學是中國著名的大學";Pattern pattern = Pattern.compile("清華");Matcher matcher = pattern.matcher(content);while (matcher.find()){String res = matcher.replaceAll("山西農業");System.out.println(res);}

輸出:

山西農業大學是中國著名的大學

反向引用

反向引用和分組、捕獲是有關系的,下面是反向引用的概念:

圓括號的內容被捕獲后,可以在這個括號后使用,從而寫出一個比較實用的匹配模式,這個我們稱之為反向引用,這種引用既可以是在正則表達式內部,用 \\分組號;也可以是在正則表達式外部,用 $分組號

案例1-AA

匹配兩個連續的相同數字。

(\\d)\\1

案例2-AAAAA

匹配五個連續的相同數字。

(\\d)\\1{4}

案例3-ABBA

找出字符串中所有滿足 ABBA 型的子串。

?(\\d)(\\d)\\2\\1
String content = "12212121212222";String regex = "(\\d)(\\d)\\2\\1";Pattern pattern = Pattern.compile(regex);Matcher matcher = pattern.matcher(content);while (matcher.find()){System.out.println(matcher.group());}

?

輸出:

1221
2222

案例4

檢索商品編號:形式如:12321-333999111 這樣的號碼,前面是一個五位數,然后是一個-,最后是一個AAABBBCCC型的9位數。

\\d{5}-(\\d)\\1{2}(\\d)\\2{2}(\\d)\\3{2}

案例5-結巴去重

?核心語句:(.)\\1+ 代表至少有兩個重復字符的子串。

public static void main(String[] args) {String content = "我...我要...學學學學...Java!";// 1. 去掉所有的.Pattern pattern = Pattern.compile("\\.");Matcher matcher = pattern.matcher(content);content = matcher.replaceAll("");// 2. 去掉重復的字pattern = Pattern.compile("(.)\\1+");matcher = pattern.matcher(content); //matcher 對象需要重新賦值content = matcher.replaceAll("$1");System.out.println(content);
}

簡潔寫法:

content = Pattern.compile("(.)\\1+").matcher(content).replaceAll("$1");

輸出:

我要學Java!

String 類中的正則表達式

1、String.replaceAll(String regex,String replacement)

將content中滿足正則表達式regex的子串替換為 replacement。

2、public boolean matches(String regex)

判斷字符串是否滿足正則表達式regex,相當于Pattern.matches(String regex,String content)。

3、public String[] split(String regex)

按照正則表達式regex分割字符串

?

?

?

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/37213.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/37213.shtml
英文地址,請注明出處:http://en.pswp.cn/news/37213.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

30 | 中國高校數據分析

一、數據源 本項目使用了兩個csv的數據文件,一個是中國高校(大學)的數據,一個是中國高校專業設置的數據 數據基本欄位:高校(大學)的數據高校專業設置的數據學校學校省份專業類別城市專業名稱地址國家特色專業水平層次辦學類別辦學類型985211雙一流二、數據分析目標 本…

電腦打開對話框中沒有桌面這個選項解決辦法

問題描述: 左側欄中的桌面圖標不顯示 解決方法: 左側的空白處右鍵-顯示所有的文件夾 這時所有的文件夾都顯示了!

從魯大師十五年,尋找軟件的生存法則

千禧之年,國內互聯網用戶數量首次突破1000萬大關,互聯網的騰飛正式拉開序幕。 從彼時算起,中國互聯網發展也不過23年,而我們記憶中那個搖著蒲扇的老頭,卻占據了其中關鍵的十五年。 這十五年中有太多曾經為人熟知的軟件…

pointpillars怎么查看tensorboard

在PointPillars中使用TensorBoard來可視化訓練過程和模型性能是很常見的做法。TensorBoard是TensorFlow提供的一個強大的工具,用于可視化訓練過程、模型圖、損失曲線、準確率等。下面是在PointPillars中使用TensorBoard的一般步驟: 請注意,上…

CHATGPT源碼簡介與使用指南

CHATGPT源碼的基本介紹 CHATGPT源碼備受關注,它是一款基于人工智能的聊天機器人,旨在幫助開發者快速搭建自己的聊天機器人,無需編寫代碼。下面是對CHATGPT搭建源碼的詳細介紹。 CHATGPT源碼的構建和功能 CHATGPT源碼是基于Google的自然語言…

flutter開發實戰-MethodChannel實現flutter與iOS雙向通信

flutter開發實戰-MethodChannel實現flutter與iOS雙向通信 最近開發中需要iOS與flutter實現通信,這里使用的MethodChannel 如果需要flutter與Android實現雙向通信,請看 https://blog.csdn.net/gloryFlow/article/details/132218837 這部分與https://bl…

Linux——基礎IO(1)

目錄 0. 文件先前理解 1. C文件接口 1.1 寫文件 1.2 讀文件 1.3 輸出信息到顯示器 1.4 總結 and stdin & stdout & stderr 2. 系統調用文件I/O 2.1 系統接口使用示例 2.2 接口介紹 2.3 open函數返回值 3. 文件描述符fd及重定向 3.1 0 & 1 & 2 3.2…

【Spring Cloud Alibaba】RocketMQ的基礎使用,如何發送消息和消費消息

在現代分布式架構的開發中,消息隊列扮演著至關重要的角色,用于解耦系統組件、保障可靠性以及實現異步通信。RocketMQ作為一款開源的分布式消息中間件,憑借其高性能、高可用性和良好的擴展性,成為了眾多企業在構建高可靠性、高吞吐…

運維面試大全

文章目錄 第一階段平常怎么處理故障,思路是什么樣的公網和私網分類以及范圍,本機地址,網絡地址,廣播地址交換機的工作原理ICMP是什么干什么用的,它有哪些命令TCP和UDP協議的區別tcp有哪些控制位,分別是什么意思你是用過哪些Linux命令Linux 系統安全優化與內核優化經常使用…

stable diffusion 單張圖片換頭roop安裝配置

1.首先安裝秋葉大佬的webui 2.然后在拓展里面搜索roop,下載roop插件,然后重啟webui 3.重啟后,在文生圖和圖生圖的界面,就可以看到roop的入口 4.這里面,需要提前安裝Visual Studio. 勾選一些必要的選項,這里可以參照b站的視頻 # 秋葉版本Stablediffusion的Roop插件的安裝 …

JavaScript reduce深入了解

reduce() 是 JavaScript 數組的一個高階函數,它允許你將數組中的元素按順序依次合并為一個單一的值。reduce() 可以用于數組求和、計算平均值、連接字符串等各種情況。它的工作原理是通過迭代數組的每個元素,然后將元素和累加器進行某種操作,…

使用 Python 在 NLP 中進行文本預處理

一、說明 自然語言處理 (NLP) 是人工智能 (AI) 和計算語言學的一個子領域,專注于使計算機能夠理解、解釋和生成人類語言。它涉及計算機和自然語言之間的交互,允許機器以對人類有意義和有用的方式處理、分析…

Java # JVM內存管理

一、運行時數據區域 程序計數器、Java虛擬機棧、本地方法棧、Java堆、方法區、運行時常量池、直接內存 二、HotSpot虛擬機對象 對象創建: 引用檢查類加載檢查分配內存空間:指針碰撞、空閑列表分配空間初始化對象信息設置(對象頭內&#xff0…

?可視化繪圖技巧100篇進階篇(五)-階梯線圖(Step Chart)

目錄 前言 圖表類型特征 適用場景 圖例 繪圖工具及代碼實現 ECharts SMARTBI

安卓中常見的字節碼指令介紹

問題背景 安卓開發過程中,經常要通過看一些java代碼對應的字節碼,來了解java代碼編譯后的運行機制,本文將通過一個簡單的demo介紹一些基本的字節碼指令。 問題分析 比如以下代碼: public class test {public static void main…

Java課題筆記~ JSP編程

4.1 JSP基本語法 JSP (全稱Java Server Pages) 是由 Sun Microsystems 公司倡導和許多公司參與共同創建的一種使軟件開發者可以響應客戶端請求,而動態生成 HTML、XML 或其他格式文檔的Web網頁的技術標準。 JSPHTMLJava JSP的本質是Servlet 訪問JSP的時候&#x…

【設計模式】原型模式

原型模式(Prototype Pattern)是用于創建重復的對象,同時又能保證性能。這種類型的設計模式屬于創建型模式,它提供了一種創建對象的最佳方式之一。 這種模式是實現了一個原型接口,該接口用于創建當前對象的克隆。當直接…

javaScript:數組的認識與使用以及相關案例

目錄 一.前言 二.數組 1.認識 2.數組的聲明 1.let arr [1,2,3,4] 2.結合構造函數,創建數組 注意: 3.數組長度的設置和獲取 注意 4.刪除數組元素 5.清空數組 三.獲取數組元素 獲取數組元素的幾種方法 1.使用方括號 [] 訪問元素&#xff1…

Keepalived+Lvs高可用高性能負載配置

環境準備 IP配置VIPnode1192.168.134.170LVSKeepalived192.168.134.100node3192.168.134.172LVSKeepalived192.168.134.100node2192.168.134.171做web服務器使用node4192.168.134.173做web服務器使用 1、準備node1與node3環境(安裝LVS與Keepalived)>…

基于微服務+Java+Spring Cloud +Vue+UniApp +MySql實現的智慧工地云平臺源碼

基于微服務JavaSpring Cloud VueUniApp MySql開發的智慧工地云平臺源碼 智慧工地概念: 智慧工地就是互聯網建筑工地,是將互聯網的理念和技術引入建筑工地,然后以物聯網、移動互聯網技術為基礎,充分應用BIM、大數據、人工智能、移…