欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中replace、replaceAll和replaceFirst函數(shù)的用法小結(jié)

 更新時間:2016年09月05日 11:22:00   作者:楊元  
相信會java的同學估計都用過replace、replaceAll、replaceFirst這三個函數(shù),可是,我們真的懂他們嗎?下面通過這篇文章大家再來好好學習學習下這幾個函數(shù)。

首先概述一下他們?nèi)齻€的用法:

· replace(CharSequence target, CharSequence replacement) ,用replacement替換所有的target,兩個參數(shù)都是字符串。

· replaceAll(String regex, String replacement) ,用replacement替換所有的regex匹配項,regex很明顯是個正則表達式,replacement是字符串。

· replaceFirst(String regex, String replacement) ,基本和replaceAll相同,區(qū)別是只替換第一個匹配項。

接下來有個簡單的需求,就是把源字符串中的a替換成\a,代碼如下:

System.out.println("abac".replace("a", "\\a")); //\ab\ac
System.out.println("abac".replaceAll("a", "\\a")); //abac
System.out.println("abac".replaceFirst("a", "\\a")); //abac

結(jié)果讓人大吃一驚,用了這么多年的替換,竟然有點蒙了。

源字符串是"abac",然后我們找到"a",把它替換成\a,由于\是java轉(zhuǎn)義字符,所以想表達\a必須寫成"\\a",第一個反斜線將第二個反斜線轉(zhuǎn)義成普通字符串。

三個替換表達式,只有第一個replace函數(shù)的結(jié)果是正確的,問題出在哪呢?

replaceAll和replaceFirst要求第一個參數(shù)是正則表達式,"a"既能理解成字符串a(chǎn),也可以理解成正則表達式a,所以第一個參數(shù)沒問題。

問題就出在第二個參數(shù)上,如果讀者仔細閱讀replaceAll函數(shù)的注釋,會發(fā)現(xiàn)有如下說明:

Note that backslashes (\) and dollar signs ($) in the replacement string may cause the results to be different than if it were being treated as a literal replacement string; see Matcher.replaceAll. Use java.util.regex.Matcher.quoteReplacement to suppress the special meaning of these characters, if desired.

由于replaceAll和replaceFirst的第一個參數(shù)是正則,所以我們可以在第二個參數(shù)中做些小花樣,比如有這樣一個需求:把源字符串中的a替換成a后邊緊鄰的字符,代碼如下:

System.out.println("abac".replaceAll("a(\\w)", "$1$1")); //bbcc
System.out.println("abac".replaceFirst("a(\\w)", "$1$1")); //bbac

正則的含義假設讀者可以讀懂,可以看出,在第二個參數(shù)中,可以用$符號獲取分組的內(nèi)容,本例中用$1取到了第一個分組的內(nèi)容,即a后邊緊鄰的字符。

因此,$符號在第二個參數(shù)中是有特殊含義的,亂寫會報錯:

System.out.println("abac".replaceAll("a(\\w)", "$")); //Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 1

那假如我就想替換成$呢?這就需要轉(zhuǎn)義字符:

System.out.println("abac".replaceAll("a", "\\$")); //$b$c

到這,讀者可能會恍然大悟,原來反斜線在第二個參數(shù)中也有特殊含義(轉(zhuǎn)義),所以如果我們想表達反斜線,就必須再轉(zhuǎn)義一次:

System.out.println("abac".replaceAll("a", "\\\\a")); //\ab\ac
System.out.println("abac".replaceFirst("a", "\\\\a")); //\abac

簡單理解一下,"\\\\a"中前邊的反斜線分別轉(zhuǎn)義后邊的反斜線,讓后邊的反斜線就是普通字符串,這樣在java內(nèi)存中看到的字符串就是"\\a",然后replaceAll函數(shù)在處理時,再用前邊的反斜線轉(zhuǎn)義后邊的反斜線,來表達后邊的反斜線就是普通字符串,不是用來轉(zhuǎn)義$的,最終內(nèi)存中的字符串就是"\a",這樣才可以成功將a替換成\a。

總結(jié)

轉(zhuǎn)義的問題確實糾結(jié),通過本文,筆者希望讀者以后使用這些函數(shù)時,能夠保持清醒,能夠意識到參數(shù)中的特殊字符,避免寫出定時炸彈。以上就是這篇文章的全部內(nèi)容,希望對大家的學習和工作能有所幫助,如果有疑問可以留言交流。

相關(guān)文章

  • Java語言中flush()函數(shù)作用及使用方法詳解

    Java語言中flush()函數(shù)作用及使用方法詳解

    這篇文章主要介紹了Java語言中flush函數(shù)作用及使用方法詳解,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • 如何用Dos命令運行Java版HelloWorld你知道嗎

    如何用Dos命令運行Java版HelloWorld你知道嗎

    這篇文章主要介紹了在dos窗口中編譯和運行java文件的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-08-08
  • Java數(shù)組常用排序算法實例小結(jié)

    Java數(shù)組常用排序算法實例小結(jié)

    這篇文章主要介紹了Java數(shù)組常用排序算法,結(jié)合實例形式總結(jié)分析了java數(shù)組常用的4種排序算法,包括冒泡排序、數(shù)組遞增排序、快速排序及選擇排序,需要的朋友可以參考下
    2017-12-12
  • Java中BufferedReader類獲取輸入輸入字符串實例

    Java中BufferedReader類獲取輸入輸入字符串實例

    這篇文章主要介紹了Java中BufferedReader類獲取輸入輸入字符串實例,分享了相關(guān)代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-02-02
  • java發(fā)送http的get、post請求實現(xiàn)代碼

    java發(fā)送http的get、post請求實現(xiàn)代碼

    下面小編就為大家?guī)硪黄猨ava發(fā)送http的get、post請求實現(xiàn)代碼。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-05-05
  • 最新Java?泛型中的通配符講解

    最新Java?泛型中的通配符講解

    Java的泛型是偽泛型,那是因為泛型信息只存在于代碼編譯階段,在生成的字節(jié)碼中是不包含泛型中的類型信息的,使用泛型的時候加上類型參數(shù),在編譯器編譯的時候會去掉,這個過程為類型擦除,這篇文章主要介紹了Java?泛型中的通配符,需要的朋友可以參考下
    2022-06-06
  • Mybatis velocity腳本的使用教程詳解(推薦)

    Mybatis velocity腳本的使用教程詳解(推薦)

    很多朋友不清楚在mybatis可以使用各種腳本語言來定義Mapper文件里面的動態(tài)SQL;目前mybatis支持的腳本語言有XML(默認的);Velocity和Freemarker三種。下面通過本文給大家介紹Mybatis velocity腳本的使用,一起看看吧
    2016-11-11
  • Spring oxm入門實例

    Spring oxm入門實例

    這篇文章主要介紹了Spring oxm入門實例,具有一定借鑒價值,需要的朋友可以參考下
    2017-12-12
  • Java異常的幾個謎題_動力節(jié)點Java學院整理

    Java異常的幾個謎題_動力節(jié)點Java學院整理

    本文給大家收藏整理java異常的幾個謎題,非常不錯,具有參考借鑒價值,需要的朋友參考下吧
    2017-06-06
  • 透過Spring源碼查看Bean的命名轉(zhuǎn)換規(guī)則圖文詳解

    透過Spring源碼查看Bean的命名轉(zhuǎn)換規(guī)則圖文詳解

    Java Bean是一種 Java 編程語言編寫的可重用軟件組件,包括符合一定規(guī)范的Java 類、屬性和方法,用于描述和處理應用程序中的數(shù)據(jù)對象,下面這篇文章主要給大家介紹了關(guān)于透過Spring源碼查看Bean的命名轉(zhuǎn)換規(guī)則的相關(guān)資料,需要的朋友可以參考下
    2023-06-06

最新評論