關(guān)于對Java正則表達式"\\"的理解
相信很多人在使用正則表達式的時候都會遇到如下的語句:



通過查閱正則表達式的API文檔可以了解到正則表達式的語法知識:

很多小伙伴就會產(chǎn)生疑問為什么語法是"\d"(或是"\D"、"\w"),為什么在語句中使用的時候就變成了"\\" ??????
下面以"\\d"為例:
理解一:
這要分兩步看
①.首先字符串中的\\被編譯器解釋為\ ------> 第一步,編譯器將字符串轉(zhuǎn)變?yōu)?ldquo;正則表達式”
②.然后作為正則表達式,\d又被正則表達式引擎解釋為“數(shù)字[0--9]" ------> 第二步,才開始把第一步的結(jié)果當(dāng)做是正則表達式,開始進行匹配!
理解二:
這個是由兩部分組成的 \ 轉(zhuǎn)義符 + \d 是一個正則表達式。標(biāo)識所有數(shù)字及0-9
之所以要加\是因為在JAVA中一些特殊的符號(回車)是沒有符號代表的。所以需要轉(zhuǎn)義符這個概念。而像回車這類轉(zhuǎn)義符都是由\開始的。那么就出現(xiàn)了第二個問題,如果我要輸入的恰恰是\符號怎么辦?那么這個問題就還用轉(zhuǎn)義符來解決。即為轉(zhuǎn)義字符的再轉(zhuǎn)義,就可以讓編譯器識別到我們輸入的并不是一個特殊字符,而是一個表示特定含義的正則表達式"\d"。
補充:為什么“java正則表達式中匹配一個反斜杠要用四個反斜杠”,java正則表達式為啥用兩個\\表示一個\
首先我們知道在正則表達式中\(zhòng)代表轉(zhuǎn)義,而java中\(zhòng)也代表轉(zhuǎn)義(一些字母前加\來表示常見的那些不能顯示的ASCII字符,如\0,\t,\n等,就稱為轉(zhuǎn)義字符)。
根據(jù)“jdk API中的原話:根據(jù) Java Language Specification 的要求,Java 源代碼的字符串中的反斜線被解釋為 Unicode 轉(zhuǎn)義或其他字符轉(zhuǎn)義。因此必須在字符串字面值中使用兩個反斜線,表示正則表達式受到保護,不被 Java 字節(jié)碼編譯器解釋。”
根據(jù)“thinking中的一段話:如果在其他語言中使用過正則表達式,那你就立刻能發(fā)現(xiàn)Java對反斜線\的不同處理.在其他語言中,\表示"我想要在正則表達式中插入一個普通的(字面上的)反斜線,請不要給他任何特殊的意義."而在Java中,\的意思是"我要插入一個正則表達式的反斜線,所以其后的字符具有特殊的意義."例如,如果你想表示一位數(shù)字,那么正則表達式應(yīng)該是\d.如果你想插入一個普通的反斜線,則應(yīng)該這樣用\\.不過換行和制表符之類的東西只需使用單反斜線:\n\t. ”
也就是java解釋字符串時,正則表達式受到保護(可以這樣理解:先由java解釋器解釋字符串,然后再由正則表達式解釋器解釋正則表達式),
那么
String pattern = "a\\\\b";
首先被java解釋器解釋為“a\b”(第一個和第三個\代表轉(zhuǎn)義,此時正則表達式受到保護,不被解釋),再被正則解釋器解釋為"a\b"。即java中由4個\表示一個\。也就是他文中所說的java正則表達式被解釋兩次。
總結(jié)
到此這篇關(guān)于對Java正則表達式"\\"理解的文章就介紹到這了,更多相關(guān)Java正則表達式"\\"內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java將Date日期類型字段轉(zhuǎn)換成json字符串的方法
這篇文章主要給大家介紹了關(guān)于Java將Date日期類型字段轉(zhuǎn)換成json字符串的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02
減少代碼開發(fā)工作的Java庫lombok及注解的使用學(xué)習(xí)
不久前發(fā)現(xiàn)有一個java第三方庫可以在一定程度上幫助我們從體力勞動中解救出來,它就是lombok。它提供了一些簡單的注解,并以此來消除java中臃腫的模版代碼。本文對于一些常用到的注解做了一個簡要的記錄,希望有更多的人enjoy it2022-07-07
關(guān)于Lists.partition集合分組使用以及注意事項
這篇文章主要介紹了關(guān)于Lists.partition集合分組使用以及注意事項,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01
Spring activiti如何實現(xiàn)指定任務(wù)處理者
這篇文章主要介紹了Spring activiti如何實現(xiàn)指定任務(wù)處理者,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-11-11
Springboot利于第三方服務(wù)進行ip定位獲取省份城市
本文主要介紹了Springboot利于第三方服務(wù)進行ip定位獲取省份城市,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07
JAVA?biginteger類bigdecimal類的使用示例學(xué)習(xí)
這篇文章主要為大家介紹了JAVA?biginteger類bigdecimal類的使用示例學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-07-07
Java DefaultListableBeanFactory接口超詳細(xì)介紹
這篇文章主要介紹了Java DefaultListableBeanFactory接口,DefaultListableBeanFactory是整個bean加載的核心部分,是Spring注冊機加載bean的默認(rèn)實現(xiàn)2022-11-11
RestTemplate的DELETE及PUT等請求方法使用精講
這篇文章主要為大家介紹了RestTemplate的DELETE及PUT等請求方法的使用精講,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步2022-03-03

