java 正则匹配_正则表达式真的很强大,可惜你不会写
專注于Java領(lǐng)域優(yōu)質(zhì)技術(shù),歡迎關(guān)注
本文旨在用最通俗的語言講述最枯燥的基本知識
文章提綱:
- 元字符
- 重復限定符
- 分組
- 轉(zhuǎn)義
- 條件或
- 區(qū)間
正則表達式在幾乎所有語言中都可以使用,無論是前端的JavaScript、還是后端的Java、c#。他們都提供相應(yīng)的接口/函數(shù)支持正則表達式。
但很神奇的是:無論你大學選擇哪一門計算機語言,都沒有關(guān)于正則表達式的課程給你修,在你學會正則之前,你只能看著那些正則大師們,寫了一串外星文似的字符串,替代了你用一大篇幅的if else代碼來做一些內(nèi)容校驗。
既然喜歡,那就動手學唄,可當你百度出一一堆相關(guān)資料時,你發(fā)現(xiàn)無一不例外的枯燥至極,難以學習(實話說,當年不理君也是這樣的心態(tài))。
下面,不理君嘗試用一種比較通俗點的方式講一下正則,讓你能在讀完之后,自己寫出一些簡單的正則,再不濟,能看到別人寫的正則,那也不錯了。
1.元字符
萬物皆有源,正則也是如此,元字符是構(gòu)造正則表達式的一種基本元素。
我們先來記幾個常用的元字符:
有了元字符之后,我們就可以利用這些元字符來寫一些簡單的正則表達式了,
比如:
2. 重復限定符
有了元字符就可以寫不少的正則表達式了,但細心的你們可能會發(fā)現(xiàn):別人寫的正則簡潔明了,而不理君寫的正則一堆亂七八糟而且重復的元字符組成的。正則沒提供辦法處理這些重復的元字符嗎?
答案是有的!
為了處理這些重復問題,正則表達式中一些重復限定符,把重復部分用合適的限定符替代,下面我們來看一些限定符:
有了這些限定符之后,我們就可以對之前的正則表達式進行改造了,比如:
3. 分組
從上面的例子(4)中看到,*限定符是作用在與他左邊最近的一個字符,那么問題來了,如果我想要ab同時被*限定那怎么辦呢?
正則表達式中用小括號()來做分組,也就是括號中的內(nèi)容作為一個整體。
因此當我們要匹配多個ab時,我們可以這樣
如:匹配字符串中包含0到多個ab開頭:
^(ab)*4. 轉(zhuǎn)義
我們看到正則表達式用小括號來做分組,那么問題來了:
如果要匹配的字符串中本身就包含小括號,那是不是沖突?應(yīng)該怎么辦?
針對這種情況,正則提供了轉(zhuǎn)義的方式,也就是要把這些元字符、限定符或者關(guān)鍵字轉(zhuǎn)義成普通的字符,做法很簡答,就是在要轉(zhuǎn)義的字符前面加個斜杠,也就是即可。
如:要匹配以(ab)開頭:
1^((ab))*5. 條件或
回到我們剛才的手機號匹配,我們都知道:國內(nèi)號碼都來自三大網(wǎng),它們都有屬于自己的號段,比如聯(lián)通有130/131/132/155/156/185/186/145/176等號段,假如讓我們匹配一個聯(lián)通的號碼,那按照我們目前所學到的正則,應(yīng)該無從下手的,因為這里包含了一些并列的條件,也就是“或”,那么在正則中是如何表示“或”的呢?
正則用符號 | 來表示或,也叫做分支條件,當滿足正則里的分支條件的任何一種條件時,都會當成是匹配成功。
那么我們就可以用或條件來處理這個問題
1^(130|131|132|155|156|185|186|145|176)d{8}$6. 區(qū)間
看到上面的例子,是不是看到有什么規(guī)律?是不是還有一種想要簡化的沖動?
實際是有的
正則提供一個元字符中括號 [] 來表示區(qū)間條件。
- 限定0到9 可以寫成[0-9]
- 限定A-Z 寫成[A-Z]
- 限定某些數(shù)字 [165]
那上面的正則我們還改成這樣:
^((13[0-2])|(15[56])|(18[5-6])|145|176)d{8}$好了,正則表達式的基本用法就講到這里了,其實它還有非常多的知識點以及元字符,我們在此只列舉了部分元字符和語法來講,旨在給那些不懂正則或者想學正則但有看不下去文檔的人做一個快速入門級的教程,看完本教程,即使你不能寫出高大上的正則,至少也能寫一些簡單的正則或者看得懂別人寫的正則了,如果需要進階學習,那就靠各位好好修煉啦。
來自:https://juejin.im/post/5b96a8e2e51d450e6a2de115
總結(jié)
以上是生活随笔為你收集整理的java 正则匹配_正则表达式真的很强大,可惜你不会写的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何和后台接触的_后台产品,不只是做支持
- 下一篇: list的contains方法为什么不好