java 正則匹配_正則表達式真的很強大,可惜你不會寫

專注于Java領域優質技術,歡迎關注

fb62d10b1dca741a8cf139d80447c210.png

本文旨在用最通俗的語言講述最枯燥的基本知識

文章提綱:

  • 元字符
  • 重復限定符
  • 分組
  • 轉義
  • 條件或
  • 區間

正則表達式在幾乎所有語言中都可以使用,無論是前端的JavaScript、還是后端的Java、c#。他們都提供相應的接口/函數支持正則表達式。

但很神奇的是:無論你大學選擇哪一門計算機語言,都沒有關于正則表達式的課程給你修,在你學會正則之前,你只能看著那些正則大師們,寫了一串外星文似的字符串,替代了你用一大篇幅的if else代碼來做一些內容校驗

既然喜歡,那就動手學唄,可當你百度出一一堆相關資料時,你發現無一不例外的枯燥至極,難以學習(實話說,當年不理君也是這樣的心態)。

下面,不理君嘗試用一種比較通俗點的方式講一下正則,讓你能在讀完之后,自己寫出一些簡單的正則,再不濟,能看到別人寫的正則,那也不錯了。

1.元字符

萬物皆有源,正則也是如此,元字符是構造正則表達式的一種基本元素。

我們先來記幾個常用的元字符:

47b467dbcfb9858a888d21fcbafab9e3.png

有了元字符之后,我們就可以利用這些元字符來寫一些簡單的正則表達式了,

比如:

  1. 匹配有abc開頭的字符串:
babc或者^abc
  1. 匹配8位數字的QQ號碼:
^dddddddd$
  1. 匹配1開頭11位數字的手機號碼:
^1dddddddddd$

2. 重復限定符

有了元字符就可以寫不少的正則表達式了,但細心的你們可能會發現:別人寫的正則簡潔明了,而不理君寫的正則一堆亂七八糟而且重復的元字符組成的。正則沒提供辦法處理這些重復的元字符嗎?

答案是有的!

為了處理這些重復問題,正則表達式中一些重復限定符,把重復部分用合適的限定符替代,下面我們來看一些限定符:

3d67178e7974b45ec7595e4813342db3.png

有了這些限定符之后,我們就可以對之前的正則表達式進行改造了,比如:

  1. 匹配8位數字的QQ號碼:
^d{8}$
  1. 匹配1開頭11位數字的手機號碼:
^1d{10}$
  1. 匹配銀行卡號是14~18位的數字:
^d{14,18}$
  1. 匹配以a開頭的,0個或多個b結尾的字符串
^ab*$

3. 分組

從上面的例子(4)中看到,*限定符是作用在與他左邊最近的一個字符,那么問題來了,如果我想要ab同時被*限定那怎么辦呢?

正則表達式中用小括號()來做分組,也就是括號中的內容作為一個整體。

因此當我們要匹配多個ab時,我們可以這樣

如:匹配字符串中包含0到多個ab開頭:

^(ab)*

4. 轉義

我們看到正則表達式用小括號來做分組,那么問題來了:

如果要匹配的字符串中本身就包含小括號,那是不是沖突?應該怎么辦?

針對這種情況,正則提供了轉義的方式,也就是要把這些元字符、限定符或者關鍵字轉義成普通的字符,做法很簡答,就是在要轉義的字符前面加個斜杠,也就是即可。

如:要匹配以(ab)開頭:

1^((ab))*

5. 條件或

回到我們剛才的手機號匹配,我們都知道:國內號碼都來自三大網,它們都有屬于自己的號段,比如聯通有130/131/132/155/156/185/186/145/176等號段,假如讓我們匹配一個聯通的號碼,那按照我們目前所學到的正則,應該無從下手的,因為這里包含了一些并列的條件,也就是“或”,那么在正則中是如何表示“或”的呢?

正則用符號 | 來表示或,也叫做分支條件,當滿足正則里的分支條件的任何一種條件時,都會當成是匹配成功。

那么我們就可以用或條件來處理這個問題

1^(130|131|132|155|156|185|186|145|176)d{8}$

6. 區間

看到上面的例子,是不是看到有什么規律?是不是還有一種想要簡化的沖動?

實際是有的

正則提供一個元字符中括號 [] 來表示區間條件。

  • 限定0到9 可以寫成[0-9]
  • 限定A-Z 寫成[A-Z]
  • 限定某些數字 [165]

那上面的正則我們還改成這樣:

^((13[0-2])|(15[56])|(18[5-6])|145|176)d{8}$

好了,正則表達式的基本用法就講到這里了,其實它還有非常多的知識點以及元字符,我們在此只列舉了部分元字符和語法來講,旨在給那些不懂正則或者想學正則但有看不下去文檔的人做一個快速入門級的教程,看完本教程,即使你不能寫出高大上的正則,至少也能寫一些簡單的正則或者看得懂別人寫的正則了,如果需要進階學習,那就靠各位好好修煉啦。

來自:https://juejin.im/post/5b96a8e2e51d450e6a2de115

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

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

相關文章

河北大學計算機復試題,2016年河北大學綜合卷計算機科學與技術學院之數據庫系統概論復試筆試最后押題五套卷...

一、選擇題1. 根據系統所提供的存取路徑,選擇合理的存取策略,這種優化方式稱為( )。A. 物理優化B. 代數優化C. 規則優化D. 代價估算優化【答案】A【解析】物理優化是根據數據字典中的存取路徑、數據的存儲分布以及聚簇情況等信息來選擇低層的…

python測驗5 函數和代碼_測驗5: 函數和代碼復用 (第5周)-單選題

1、以下選項不是函數作用的是:???????????????????????????????????????????????????????????????????????????????? A、 提高代碼執行速度 B、 復用代碼 C、 降低編程復雜度 D、…

石板切割問題c語言_廣場地面鋪裝 仿古石 青石板 板巖 切割巖 冰裂紋壓印混凝土地坪...

廣場地面鋪裝 仿古石 青石板 板巖 切割巖 冰裂紋壓印混凝土地坪廣場地面鋪裝 仿古石 青石板 板巖 切割巖 冰裂紋壓印混凝土地坪青石板是由青色的沉積巖劈制或者切割而成的板材,是天然板巖的一種,主要成分為石灰石、白云石。其比重約2.2~2.7克/立方厘米&a…

編程doc轉html,Python批量將word轉html,并將html內容發布至網站。

搜索熱詞下面是編程之家 jb51.cc 通過網絡收集整理的代碼片段。編程之家小編現在分享給大家,也給大家做個參考。#codingutf-8__author__ zhmfrom win32com import client as wcimport osimport timeimport randomimport MysqLdbimport redef wordsToHtml(dir):#批量…

python分析工具有哪些_常用Python數據分析工具匯總

Python是數據處理常用工具,可以處理數量級從幾K至幾T不等的數據,具有較高的開發效率和可維護性,還具有較強的通用性和跨平臺性。Python可用于數據分析,但其單純依賴Python本身自帶的庫進行數據分析還是具有一定的局限性的&#xf…

python軟件是什么原因引起的_Python對程序員重要的原因在哪里?

Python 之父Fredrik Haard最近發表了一篇“為什么Python對你如此重要”的文章,引起了開發者的熱烈討論。我相信Python對軟件開發人員很重要。現今已經誕生了不少的編程語言,它們都有各自不同的特性:強大者如Lisp,快速如C&#xff…

大學計算機需要論文嗎,關于大學計算機論文范文.docx

關于大學計算機論文范文一:大學計算機基礎實驗教學課程改革計算機基礎是高校非計算機專業非常重要的一門公共基礎課程,課程內容是大學生必須掌握的計算機基礎知識和操作技能,是大學生走向工作崗位必備的基本素質。計算機基礎知識的掌握與實際…

高并發編程_高并發編程系列:全面剖析Java并發編程之AQS的核心實現

在并發編程領域,AQS號稱是并發同步組件的基石,很多并發同步組件都是基于AQS實現,所以想掌握好高并發編程,你需要掌握好AQS。本篇主要通過對AQS的實現原理、數據模型、資源共享方式、獲取鎖的過程,讓你對AQS的整體設計有…

python怎么測試c代碼_如何正確測試python中的C-API,C-API返回錯誤代碼

我的設置 我正在使用Python中的pytest和ctypes測試C庫中的函數。C庫中的每個函數調用一個嵌入式linux PCI板上的函數,然后C庫函數返回一個整數,該整數映射到一組返回代碼。如果函數成功,則返回0,否則返回其他錯誤代碼。在 問題 我…

計算機考試設計會議邀請函,計算機二級常見考點之使用合并技術制作邀請函

計算機01:37來自LearningYard學苑三月份的計算機二級考試即將到來,不知道各位童鞋準備得怎么樣了呢,把握了多少。今天小編就給講講計算機二級MS office中常見的考核內容——使用合并技術制作邀請函。The computer second-level exam in March is coming …

添加一列_辦公軟件操作技巧023:如何給excel數據批量添加單位

在日常工作中,我們使用excel編輯電子表格時,經常需要給數據添加單位,單位是編制excel表格常用的元素,有時我們需要給一列數字都添加上單位,比如長度多少米,金額多少元,貨物多少公斤等等&#xf…

html代碼大全(很全的)_HTML教學(1):寫一個屬于自己的網址大全(新手版)

超文本標記語言(Hyper Text Markup Language),縮寫為HTML,標準通用標記語言下的一個應用。HTML不是一種編程語言,而是一種標記語言 (markup language)只要你打開瀏覽器,第一眼看到的…

清華大學計算機系高考生源,清華大學在這個高考大省錄取人數創新高,網友:仍然是同分不同命...

在眾多高考學子眼中,只有“兩個學校”,一個是“清華、北大”,一個是“其他學校”,不僅是高考學子,清華、北大在眾多人心目中也是十分神圣的。很多學生家長把考上清華、北大作為子女的唯一追求,認為只有考上…

list的contains方法為什么不好使_道理都懂,為什么我們還打不好網球?

中年人的悲哀在于,懂得很多道理,可依然過不好自己的一生。打網球亦是如此。——題記人到中年,有了一定的社會經驗,也懂得了很多道理,可大部分人還是過不好自己的生活。正如打網球一樣。盯準球、早點打、降低重心、保持…

docker公共存儲庫_Docker Hub公共鏡像倉庫的使用

Docker Hub目前 Docker 官方維護了一個公共倉庫 Docker Hub,其中已經包括了數量超過 15,000 的鏡像。大部分需求都可以通過在 Docker Hub 中直接下載鏡像來實現。Docker Hub的功能Docker Hub被用于源代碼管理集成,也用于構建和測試工具來加速部署周期&am…

html5登錄界面源代碼_最新版本尤娜博客已更新源代碼(速拿!!!)

大家好,我是尤娜博客(una-boot)的作者樹下魅狐,自2019年9月una-boot-1.0.0版本開源以來,陸續有熱愛技術,鐘愛技術寫作的小伙伴為尤娜提出了寶貴的改進意見和建議,在此表示衷心的感謝,謝謝大家的支持&#x…

抓包紅色_抓包三部曲 WebSocket 協議原理抓包分析

這篇文章通過抓包分析 WebSocket 協議的細節,學習一下 WebSocket 執行流程。1.WebSocket 流程說明(1)客戶端和服務器之間完成三次握手建立 TCP 連接(TLS/SSL)握手。(2)客戶端發起 HTTP 請求和服務器之間建立 WebSocket 握手。(3)WebSocket 連接建立之后,…

計算機農業sci,IEEE旗下JCR1區智慧農業類SCIEI期刊

原標題:IEEE旗下JCR1區智慧農業類SCI&EI期刊各位學者,EA-ISET 協會(www.ea-iset.org)重點期刊推薦,IEEE旗下JCR1區智慧農業類SCI&EI期刊 ,版面有限,錄滿即止,具體信息如下:一、期刊信息JCR1區智慧農…

python 多條件 選擇 算法_python部署python算法 - 快速尋找滿足條件的兩個數

題目前提是一定存在這樣兩個數 解法一就不寫了...一般想不到吧 一開始想到的是解法二最后的用hash表 (其實是想到創建一個跟target一樣大的數組啦..存在就寫入index,但是要全部找出,那得二維數組,但是后面想到target要是很大的話&…

3d打印主要的切片參數類型_3D打印機切片參數詳情說明

在使用3D打印機的過程中,切片是一個我們無法避免要操作的步驟,接下來我們將簡單介紹一下切片的相關參數。底部類型設置模型打印第一層的類型,以適應不同打印需求Skirt模型底部不與模型接觸,確保擠出正常SkirtBrim與模型底部接觸&a…