Java中使用正則表達式的正確打開方式

正則表達式基礎語法

Java正則表達式基于java.util.regex包,核心類是PatternMatcher。基本語法遵循標準正則規范:

  • . 匹配任意單個字符(除換行符)
  • \d 匹配數字,等價于 [0-9]
  • \w 匹配單詞字符,等價于 [a-zA-Z0-9_]
  • \s 匹配空白字符(空格、制表符等)
  • [] 字符集合,如 [abc] 匹配a、b或c
  • ^ 在字符集中表示否定,如 [^abc] 匹配非a/b/c的字符
  • * 匹配前一個元素0次或多次
  • + 匹配前一個元素1次或多次
  • ? 匹配前一個元素0次或1次
  • {n} 精確匹配n次
  • {n,} 匹配至少n次
  • {n,m} 匹配n到m次
  • | 寫在方括號外面,表示或
  • && 交集,表示與
  • (?!) 忽略后面字符的大小寫

常用預定義字符類

\\d    數字 [0-9]
\\D    非數字 [^0-9]
\\s    空白字符 [ \\t\\n\\x0B\\f\\r]
\\S    非空白字符 [^\\s]
\\w    單詞字符 [a-zA-Z_0-9]
\\W    非單詞字符 [^\\w]

邊界匹配符

  • ^ 匹配行首
  • $ 匹配行尾
  • \b 匹配單詞邊界
  • \B 匹配非單詞邊界

Java中的特殊處理

在Java字符串中需要使用雙反斜杠轉義:

// 匹配數字的正則表達式
String regex = "\\d+"; // 實際表示 \d+

Pattern和Matcher使用示例

import java.util.regex.*;String text = "Hello 123 World";// Pattern:表示正則表達式
Pattern pattern = Pattern.compile("\\d+");
// Matcher:文本匹配器,從頭開始讀取,直到讀取到匹配的字符串
Matcher matcher = pattern.matcher(text);// 查找匹配
while (matcher.find()) {System.out.println("Found: " + matcher.group());
}// 匹配整個字符串
boolean isMatch = Pattern.matches("Hello.*", text);
  • 貪婪爬取:用+,*,表示盡可能多的獲取數據
  • 非貪婪爬取:在+,*后面加上?,表示盡可能少的獲取數據
        String str = "aaaaaaaaaabbbbbbbbaaaaaaaaa";System.out.println("--------- 貪婪匹配 ---------");// 貪婪匹配Pattern p = Pattern.compile("ab+");Matcher m = p.matcher(str);while (m.find()) {System.out.println(m.group());}System.out.println("--------- 懶惰匹配 ---------");// 懶惰匹配Pattern p1 = Pattern.compile("ab+?");Matcher m1 = p1.matcher(str);while (m1.find()) {System.out.println(m1.group());}

效果圖:

分組和捕獲

使用()創建捕獲組:

String str = "a123a";String str1 = "abc123abc";String str2 = "1117891111";String str3 = "aa7879a";// 捕獲分組System.out.println("--------- 捕獲分組 ---------");String regex = "(.).+\\1";String regex1 = "(.+).+\\1";String regex2 = "((.)\\2).+\\1";System.out.println(str.matches(regex));System.out.println(str1.matches(regex1));System.out.println(str2.matches(regex2));System.out.println(str3.matches(regex2));// 非捕獲分組System.out.println("--------- 非捕獲分組 ---------");String str4 = "我要學學變變變變撐撐撐撐撐";str4 = str4.replaceAll("(.)\\1+", "$1");// replaceAll() 方法用于把所有滿足匹配的字符串替換成指定的字符串System.out.println(str4);

效果圖:

  • 從1開始,連續不斷
  • 以左括號為基準
  • 捕獲分組(默認):① 內部:\\組號?② 外部:$組號(組號會保留下來)
  • 非捕獲分組:使用條件,不占組號
    • "?=":表示任一數據
    • "?:":表示所有數據
    • "?!":表示不包含這些數據

常用正則表達式示例

  • 郵箱驗證:
String emailRegex = "^[\\w-_.+]*[\\w-_.]@([\\w]+\\.)+[\\w]+[\\w]$";
  • 手機號驗證(中國大陸):
String phoneRegex = "^1[3-9]\\d{9}$";
  • 身份證號驗證(簡易版):
String idCardRegex = "^[1-9]\\d{5}(18|19|20)\\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\\d|3[01])\\d{3}[0-9Xx]$";
  • URL驗證:
String urlRegex = "^(https?://)?([\\w-]+\\.)+[\\w-]+(/[\\w-./?%&=]*)?$";

特殊匹配模式

通過Pattern的常量設置匹配模式:

// 不區分大小寫匹配
Pattern.CASE_INSENSITIVE // 多行模式(^和$匹配每行的開頭和結尾)
Pattern.MULTILINE// 示例:不區分大小寫匹配
Pattern.compile("hello", Pattern.CASE_INSENSITIVE).matcher("Hello").find(); // true

字符串替換

使用正則表達式進行字符串替換:

String text = "a1b2c3";
String replaced = text.replaceAll("\\d", "-"); // a-b-c-

性能優化建議

  1. 預編譯常用正則表達式:
private static final Pattern EMAIL_PATTERN = Pattern.compile(emailRegex);
  1. 避免過度使用.通配符,盡可能明確匹配范圍

  2. 對于簡單固定字符串匹配,優先使用String.contains()String.startsWith()等原生方法

  3. 謹慎使用回溯量大的表達式(如嵌套的量詞)

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

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

相關文章

Docker中Mysql容器忽略大小寫

場景說明 在數據遷移場景中,從一個數據庫中將數據遷移到另一個數據,經常會遇到,兩個不同數據庫之間,一個默認忽略大小寫,一個默認不忽略大小寫,導致實際業務層服務進行數據庫訪問時,切換數據庫之…

神經網絡激活函數:從ReLU到前沿SwiGLU

摘要 本文全面介紹了神經網絡中常用的激活函數,包括Sigmoid、Tanh、ReLU等傳統函數,以及2017年后出現的Swish、Mish、SwiGLU等新興函數。每個函數均提供數學定義、優缺點分析、Python實現代碼和可視化圖像,并附有實際應用建議和性能對比數據,幫助讀者根據具體任務選擇合適…

線程池常見面試問答

好嘞 &#x1f44d;&#xff0c;我幫你把這些 線程池 并發編程八股文 整理成 問答對照表&#xff08;Q & A&#xff09;&#xff0c;你面試時可以直接用。&#x1f9fe; 線程池常見面試問答一、基礎語法 & STLQ1&#xff1a;std::function<void()> 和函數指針的…

Flutter 開發技巧 AI 快速構建 json_annotation model 的提示詞

將下面這段復制到AI GPT、DeepSeek 、文心快碼 試過效果都可以&#xff0c;不用做任何更改。將 json 數據丟給 AI 就行了 我會提供一段 JSON 數據&#xff0c;請幫我生成 Dart 模型&#xff0c;要求嚴格如下&#xff1a;1. 使用 json_annotation 包&#xff0c;包含&#xff1a…

【秋招筆試】2025.08.30科大訊飛秋招筆試題

?? 點擊直達筆試專欄 ??《大廠筆試突圍》 ?? 春秋招筆試突圍在線OJ ?? 筆試突圍在線刷題 bishipass.com 科大訊飛 題目一:物品種類統計 1??:使用集合或哈希表統計不同物品編號的數量 2??:利用數學公式 n - 不同種類數 計算最終答案 難度:簡單 這道題目的關…

AI 智能體匯總,自動執行任務的“真 Agent”

AI Agent 正在掀起一場靜默的效率革命&#xff1a;當 AI 遇上 RPA&#xff0c;真正的“數字員工”時代已經到來最近一段時間&#xff0c;我密集關注了多場 AI Agent&#xff08;智能體&#xff09;的發布會&#xff0c;覆蓋了從消費級到企業級的各類產品。一個越來越清晰的趨勢…

vue布局

給于2個div塊狀元素的布局方案1&#xff1a;橫向并排&#xff08;Flex Row&#xff09;<template><div class"container"><div class"background">背景</div><div class"panel">內容</div></div> <…

Hysplit大氣傳輸和污染擴散-軌跡聚合標準20%30%用途

1、HYSPLIT軌跡聚合中的百分比標準在HYSPLIT模型中&#xff0c;軌跡聚合&#xff08;Trajectory Clustering&#xff09;用于將大量軌跡按相似性分組&#xff0c;20%和30%是常見的聚合閾值標準&#xff0c;反映軌跡間的空間相似度要求。2、20%和30%的具體含義這兩個百分比代表軌…

Linux shell 腳本基礎 003

目錄 Linux shell 腳本語句 1. for 循環流程控制 1.1 基本語法格式 1.2 常見用法示例 1.3生產案例示例 2. while 循環 2.1 基本語法格式 2.2 常見用法示例 3. case 語句 3.1 基本語法格式 3.2 常見用法示例 3.3生產案例示例 4. shell 函數 4.1 函數的定義 4.2 函…

7.1elementplus的表單

Element Plus 表單由以下幾個關鍵部分構成&#xff1a;<el-form>: 表單容器。它是整個表單的根組件&#xff0c;負責管理表單數據、校驗規則、布局方式等。<el-form-item>: 表單項容器。用于包裹一個具體的表單控件&#xff08;如輸入框、選擇器等&#xff09;及其…

TF-IDF:文本分析的“火眼金睛”

TF-IDF&#xff1a;文本分析的“火眼金睛” 在信息爆炸的時代&#xff0c;我們每天都會接觸到海量的文本數據。如何從這些數據中快速找出最重要的信息&#xff1f;TF-IDF&#xff08;Term Frequency-Inverse Document Frequency&#xff09;算法就是一種非常實用的工具&#xf…

傳統星型拓撲結構的5G,WiFi無線通信網絡與替代拓撲結構自組網

一、個人理解 區別自組網&#xff0c;5G和WiFi三者要抓住兩個關鍵點&#xff1a;移動、組網。 5G通信是移動通信的最新一代&#xff1b;1940年代美軍的手持對講機雖然可以移動&#xff0c;但是算不上網絡&#xff0c;后面的第一代移動通信蜂窩網絡才能算上網絡。 WiFi通信雖…

REST API 是無狀態的嗎,如何保障 API 的安全調用?

當然&#xff0c;這是一個非常核心的API設計和安全領域的問題。我們來詳細拆解一下。1. REST API 是無狀態的嗎&#xff1f;?是的&#xff0c;REST API 的核心原則之一就是“無狀態”&#xff08;Statelessness&#xff09;。??這意味著&#xff1a;?服務器不保存客戶端的會…

Machine Learning HW3 report:圖像分類(Hongyi Lee)

任務&#xff1a;使用CNN把食物圖片分為11類&#xff08;不能使用預訓練的模型&#xff09;。此任務很耗時&#xff0c;一次訓練至少1h&#xff0c;所以要利用好Kaggle notebook中Save Version功能&#xff0c;并行訓練節省時間。 基準 Simple : 0.50099Medium : 0.73207 Train…

Element整體操作樣式

Element: 給表格整體設置斑馬紋 在main.js中 ElementUI.Table.props.stripe {type: Boolean,default: true }在element-ui.scss中 // // 為所有 el-table 設置默認斑馬紋 // .el-table { // &.el-table--enable-row-hover .el-table__body tr:hover > td { // ba…

谷歌官宣組建“網絡攻擊部門”,美國網絡安全戰略轉向“以攻代防”

谷歌宣布將組建網絡攻擊部門8月27日&#xff0c;谷歌宣布將組建網絡攻擊部門&#xff08;disruption unit&#xff09;。谷歌威脅情報集團副總裁Sandra Joyce在本周二的網絡安全政策會議上表示&#xff0c;谷歌正在尋找“合法且符合道德規范的干擾方案”&#xff0c;通過情報主…

Rust Tokio異步任務實戰教程(高級功能)

1. 強大的異步 I/O 多路復用Tokio 的核心競爭力之一是對操作系統原生異步 I/O 機制的封裝&#xff08;如 Linux 的 epoll、Windows 的 IOCP、macOS 的 kqueue&#xff09;&#xff0c;這是異步非阻塞的底層基石。作用&#xff1a;允許單線程同時監聽成百上千個 I/O 事件&#x…

8.1【Q】VMware相關

在圖四中&#xff0c;Interface Layer是用來干什么的&#xff1f;IOBus是什么我正在使用VMware虛擬機&#xff0c;但是沒有網絡&#xff08;宿主機有網&#xff09;&#xff0c;我該如何配置網絡&#xff1f;網絡連接模式??&#xff1a;??NAT模式??&#xff08;推薦&…

從卡頓到絲滑:大型前端項目 CSS 優化全攻略

摘要 頁面樣式變重是大前端項目常見的后遺癥&#xff1a;CSS 體積越來越大、首屏卡、切頁抖、首包飆。核心問題其實就三件事&#xff1a;把首屏必須的樣式盡快給到瀏覽器、把非首屏的樣式晚點再說、把多余的樣式堅決清理掉。本文用可運行的 Demo 和工程化流程&#xff0c;帶你…

CSS基礎學習第二天

1.emmet語法1&#xff09;快速生成HTML結構語法---標簽名tab鍵即可生成標簽---標簽*數量即可生成多個標簽---如果有父子級關系的標簽&#xff0c;用>&#xff0c;比如ul>litab鍵---如果有兄弟級的標簽&#xff0c;用tab鍵---如果生成帶有類名或者id名字的&#xff0c;直接…