Java 正則表達式

来源:https://www.cnblogs.com/chy18883701161/archive/2019/05/13/10859809.html
-Advertisement-
Play Games

1、正則表達式語法: ...


 

正則表達式是一個用於匹配字元串的模板,用於匹配字元串。

 

 

正則表達式語法:

 

 .  小數點,可匹配\n之外的任何一個字元,要匹配小數點,用\.

x  x是某一具體字元,表示匹配該字元

\d  匹配0-9之間的一個數字

\D  匹配\d之外的任一個字元

\s  匹配任一個空白,包括空格、製表符、回車符、換行符

\S  匹配\s之外的任一個字元

\w  匹配任一個單詞字元,包括數字0-9,英文字母大寫26個、小寫26個,下劃線_

\W  匹配\w之外的任一個字元

\t  製表符

\n  換行符

\r  回車符

以上式子均只匹配一個字元

 

 

\  表示匹配一個正則表達式中的預定義符號,例:\\匹配一個\, \(匹配一個(,   \?匹配一個?

|  表示2項中選擇一項,相當於“或”。例:ab|c表示匹配ac或bc,(ab)|[a-d]表示匹配ab或a-d之間的任一個字元,ab|cd|e表示匹配abd、abe、acd、ace中的任一個。

 

 

()     表示一個子表達式,將此子表達式作為一個整體來看。要匹配(),用\(    \)

 

 

中括弧:

[]  表示匹配指定範圍中的任一個字元,例:[abc]表示匹配a、b、c中的任一個字元。

-  表示範圍,例:[!a-z]表示匹配!、所有小寫字母中的任一個字元

^  表示非,例:[^abc]表示匹配a、b、c之外的任一個字元,[^a-d]表示匹配a、b、c、d之外的任一個字元。要把後面部分當成一個整體來看

&&  表示取交集,例:[a-d&&c-z]相當於[cd],匹配c,d中的任一個字元

中括弧只匹配一個字元。要匹配[] ,使用\[  \]

 

 

數量限定:

*  0次及以上。匹配*請用\*

+  1次及以上。匹配+請用\+

?  0次或1次

{m}     m次

{m,}  至少m次

{m,n}  至少m次,至多n次。

以上均表示前一個字元、(子)表達式出現的次數

 

 

位置限定:

^  行的開頭,放在該部分前面,例:^H   表示匹配H,H要是一行的開頭

$  行的結尾,放在該部分的後面,例:。$      表示匹配。   。要是一行的結尾

\b  單詞的邊界,前邊界就放在該部分的前面,後邊界就放在該部分的後面,例:\bH  表示匹配H,H要是某個單詞的開頭;H\b表示匹配H,H要是某個單詞的結尾。

\B  不是單詞的邊界。不是前邊界就放在該部分的前面,不是後邊界就放在該部分的後面,例:\BH  表示匹配H,H不是某個單詞的開頭;H\B表示匹配H,H不是某個單詞的結尾。

以上均是對一個字元、(子)表達式位置的說明。

 

 

 

 

 

使用正則表達式有兩種方式:使用String類的方法,使用Pattern+Matcher兩個類。

 

 

1、使用String類的方法:

boolean  matches(String  regex)    該串中是否有匹配。此方法是整串匹配,即該串整個是regex的一個匹配才返回true。比如"hello".matches("hello")返回true,"hello".matches("he")返回false。

String  replaceFirst(String regex,String replacement)  替換第一個匹配,返回替換後的串。若無匹配,則返回原串。

String  replaceAll(String regex,String replacement)     替換所有的匹配,返回替換後的串。若無匹配,則返回原串。

String[]  split(String regex)    以regex作為分隔符,把該串分割成多個子串

String  Arrays.toString(String[]  arr)    將String[]連接成一個字元串並返回。靜態方法。

 

示例:

 1 package test;
 2 
 3 public class Test{
 4        public static void main(String[] args){
 5               String str="hello world!";
 6               System.out.println(str.replaceFirst("h","H"));    //Hello world!
 7               //正則表達式是\w,但放在""內,\要轉義為\\
 8               System.out.println(str.replaceFirst("\\w","H"));    //Hello world!
 9        }
10 }

 

 

 

 

2、使用Pattern+Matcher兩個類

Pattern對象是正則表達式編譯後在記憶體中的表示形式,需要先調用Pattern類的靜態方法compile(String regex)將正則表達式編譯為Pattern對象:

Pattern  p=Pattern.compile("\\w");       //參數為正則表達式

 

再使用Pattern對象的matcher(String str)獲取Matcher對象:

Matcher  m=p.matcher("hello world!");      //參數為字元串(用上面的regex匹配這個字元串)

 

之後就可以用Matcher對象的方法來匹配該串:

boolean   b=m.matches();       //是否有匹配,這個方法是整串匹配。註意上面是er,這裡是es。

boolean  b=m.find();      //是否有匹配,該串中有匹配就返回true。

String  str=m.replaceFirst(String replacement);     //用指定字元串替換第一個匹配,返回替換後的串

String  str=m.replaceAll(String replacement);     //用指定字元串替換所有匹配,返回替換後的串

 

示例:

 1 package test;
 2 
 3 import java.util.regex.Matcher;
 4 import java.util.regex.Pattern;
 5 
 6 public class Test{
 7        public static void main(String[] args){
 8               Pattern p=Pattern.compile("\\bhe");
 9               Matcher m=p.matcher("hello world!");
10               System.out.println(m.find());   //true
11               System.out.println(m.matches());   //false
12               System.out.println(m.replaceFirst("He"));   //Hello world!
13               System.out.println(m.replaceAll("He"));   //Hello world!
14        }
15 }

 

上面的Pattern對象可以重覆使用,就是說可以直接使用這個正則表達式去匹配其它的字元串。

如果某個正則表達式只需要使用一次,可以這樣:

Boolean  b=Pattern.matches(String regex,String str);      //會把regex編譯成匿名的Pattern對象,並執行匹配

註意:只有matches()方法可以這樣用。mathces()是Pattern的靜態方法。

 

 

 

 

 

數量匹配模式:

1、Greedy(貪婪模式):數量表示符預設使用貪婪模式匹配,儘可能多的匹配字元,除非明確使用其它匹配模式。例:

\w{2,5}     會儘可能多的匹配,能匹配5個就匹配5個,不行就4個,再不行就3個........     

 \w?     ?表示匹配0次或1次,會優先匹配1次,沒有才匹配0次。

\w+    +表示匹配1次及以上,優先匹配最多次。

 

2、Reluctant(勉強模式):儘可能少的匹配字元,也稱最小匹配模式。需要在數量表示符後用一個額外的?來說明該部分使用最小匹配模式。例:

\w{2,5}?\w   \w{2,5}?會優先匹配2個

\w??\w        \w?會優先匹配0個

\w+?  會優先匹配1次

?要放在數量表示符後面,才表示前面該部分採用   最小匹配模式。如果?之前無數量表示符,則?表示匹配0個或1個,會採用貪婪模式。

 

3、Possessive(占有模式),在數量表示符後面用一個額外的+來說明該部分使用占有模式,不常用。

 

 

 

註意:

Java中的正則表達式一般是放在雙引號中的,\需要轉義。例:

\w  對應"\\w"

 

只需要轉義\,其它預定義的符號,比如?、()、*等,不用轉義。

 


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

-Advertisement-
Play Games
更多相關文章
  • 背景 很多人心裡是想一直做技術的,但是擔心隨著年紀增加,會造成在技術方面的競爭力不足。加上迫於經驗人士的壓力,就在糾結要不要轉管理崗。不是什麼權威意見,僅僅談談個人看法。 個人觀點:做自己想做的事。 優劣勢 技術和管理兩個路線各有優劣勢。用SWOT分析來展現兩個維度的關係。 如果有朋友對到底是走哪個 ...
  • 第1題:閱讀下麵的代碼,默讀出A0,A1至An的最終值。 默讀代碼類的題目,相對來說是比較簡單的。重點去研究列表解析,之後你就可以輕鬆的回答這些問題嘍~ 第2題:如何提高python的運行效率? 1. 數據結構一定要選對 能用字典就不用列表:字典在索引查找和排序方面遠遠高於列表。 2. 多用pyth ...
  • 內容簡介 本書面向所有對機器學習與數據挖掘的實踐及競賽感興趣的讀者,從零開始,以Python編程語言為基礎,在不涉及大量數學模型與複雜編程知識的前提下,逐步帶領讀者熟悉並且掌握當下最流行的機器學習、數據挖掘與自然語言處理工具,如Scikitlearn、NLTK、Pandas、gensim、XGBo ...
  • Java9的日誌級別: ALL 最低級別,系統會輸出所有的日誌信息,會生成大量的·、冗餘的日誌 TRACE 輸出系統的各種跟蹤信息,會生成大量的·、冗餘的日誌 DEBUG 輸出調試信息,會生成較多的日誌 INFO 輸出系統提示用戶的信息 WARNING 輸出警告信息 ERROR 輸出錯誤信息 OFF ...
  • 筆記 7天學完Java基礎之0/7 1.常用命令提示符(cmd) 啟動: Win+R,輸入cmd​ :twisted_rightwards_arrows: cmd 切換盤符 盤符名稱+:(冒號為英文輸入法下的冒號) 進入指定文件夾 cd +文件夾名稱 註意只能夠進入文件夾,不能夠進入文件哦 查看當前 ...
  • 國際化是指應用程式運行時,可根據客戶端OS的國家/地區、語言的不同而顯示不同的界面,比如客戶端OS的語言環境為大陸的簡體中文,程式就顯示為簡體中文,客戶端OS的語言環境為美國——英語,程式就顯示美式英語。 OS的語言環境可在控制面板中手動設置。 國際化的英文單詞是Internationalizati ...
  • Python進階之網路編程,內容包括 網路通信,socket,udp,tcp。其中,網路通信 包括 使用網路的目的,ip地址,埠;socket 包括 socket的概念,創建socket;udp 包括 udp發送數據,udp接收數據,udp接發數據總結,埠綁定的問題,單工半雙工全雙工;tcp 包... ...
  • "概要" "開發" "web 框架" "資料庫" "認證" "日誌" "配置" "靜態文件服務" "上傳/下載" "發佈" "docker 打包" "部署中遇到的問題" "時區問題" 概要 輕量的基於 golang 的 web 開發實踐. golang 上手簡單, 第三方庫豐富, 對於業務沒那麼複雜 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...