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

java字符串的替換replace、replaceAll、replaceFirst的區(qū)別說(shuō)明

 更新時(shí)間:2022年03月02日 08:42:28   作者:龍昊雪  
這篇文章主要介紹了java字符串的替換replace、replaceAll、replaceFirst的區(qū)別說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

字符串的替換replace、replaceAll、replaceFirst區(qū)別

如果不是剛剛復(fù)習(xí)了下正則表達(dá)式,我可能也不會(huì)注意到,原來(lái)String的replaceAll跟replaceFirst用到了正則表達(dá)式!

不多解釋,看代碼

String s = "my.test.txt";
System.out.println(s.replace(".", "#"));
System.out.println(s.replaceAll(".", "#"));
System.out.println(s.replaceFirst(".", "#"));

運(yùn)行結(jié)果:

my#test#txt
###########
#y.test.txt

是不是感覺很神奇?

其實(shí)懂正則表達(dá)式的應(yīng)該已經(jīng)發(fā)現(xiàn)了,是的,“.”是正則表達(dá)式的元字符,匹配除換行符以外的任意字符,所以replaceAll、replaceFirst才出現(xiàn)了這樣的結(jié)果。

而replace沒有用到正則表達(dá)式,但會(huì)把所有“.”替換掉,很多人可能會(huì)誤解replace是替換單個(gè),而replaceAll是替換全部,其實(shí)這是錯(cuò)的(我以前也是這么想的- -)。replace只是沒有用到正則表達(dá)式,但會(huì)替換所有匹配的字符串。

到這里一些不懂正則表達(dá)式的小伙伴可能就要喊坑爹了,“那我不想用正則表達(dá)式去替換第一個(gè)字符串腫么辦?”其實(shí)也很簡(jiǎn)單,只要將元字符串轉(zhuǎn)義就行了。 

s.replaceFirst("\\.", "#")

運(yùn)行結(jié)果: 

my#test.txt

這里給個(gè)會(huì)被正則表達(dá)式識(shí)別的字符列表:

  • .匹配除換行符以外的任意字符
  • ^匹配字符串的開始
  • $匹配字符串的結(jié)束
  • *重復(fù)零次或更多次
  • +重復(fù)一次或更多次
  • ?重復(fù)零次或一次

當(dāng)然,正則可遠(yuǎn)不止這么點(diǎn),個(gè)人建議花點(diǎn)時(shí)間去學(xué)習(xí)一下比較好~

補(bǔ)充:String的split也是用到了正則表達(dá)式,使用的時(shí)候注意點(diǎn)哦!

replaceAll、replaceFirst使用需要注意的問(wèn)題

昨天系統(tǒng)報(bào)錯(cuò),No group 6,上網(wǎng)查詢,說(shuō)是replaceAll()的問(wèn)題,就具體試驗(yàn)了一下,發(fā)現(xiàn)如果不注意,就會(huì)產(chǎn)生隱含的錯(cuò)誤。

java的String類的replaceAll方法是一個(gè)挺常用的方法,

類型定義如下

String replaceAll(String regex, String replacement)

有兩個(gè)參數(shù),第一個(gè)是被替換的字符串,是正則表達(dá)式,另外一個(gè)是替換成的字符串。

如果我們這樣寫

upLoadedFileName.replaceAll("","/"); ? ? ? ? ? // 把//替換為/

是沒有什么問(wèn)題的,而且用好正則表達(dá)式可以實(shí)現(xiàn)很強(qiáng)的功能,如:

str.replaceAll("(?i)"+oldStr,newStr);//忽略大小寫;

但是,使用中我們一定要記住,不僅僅第一個(gè)參數(shù)是正則表達(dá)式,第二個(gè)也是,因此如果這兩個(gè)是可變參數(shù),就要注意參數(shù)的內(nèi)容,一篇文檔說(shuō)應(yīng)該在所有的[ / ^ $ . | ? * + ( ) { }符號(hào)前面加上/符號(hào)。經(jīng)過(guò)我的測(cè)試(jdk1.4),只有/和$容易出錯(cuò)。

比如:

System.out.println("/".replaceFirst("/", "http://"));

系統(tǒng)會(huì)報(bào):

java.lang.StringIndexOutOfBoundsException: String index out of range: 1

System.out.println("/".replaceFirst("/", "x//"));

系統(tǒng)會(huì)報(bào):

java.lang.StringIndexOutOfBoundsException: String index out of range: 2

System.out.println("/".replaceFirst("/", "http://X"));

執(zhí)行結(jié)果是X

System.out.println("/".replaceFirst("/", "$6"));

執(zhí)行結(jié)果拋出例外:

java.lang.IndexOutOfBoundsException: No group 6

所以如果參數(shù)是變量,而且可能包含/或$,建議不要使用replaceAll和replaceFirst方法。

我實(shí)現(xiàn)了這兩個(gè)方法,大家可以直接引用

? ?/**
? ? * 字符串替換,從頭到尾查詢一次,替換后的字符串不檢查
? ? * @param str ? ? 源字符串
? ? * @param oldStr ?目標(biāo)字符串
? ? * @param newStr ?替換字符串
? ? * @return ? ? ? ?替換后的字符串
? ? */
? ?static public String replaceAll(String str, String oldStr, String newStr)
? ?{
? ? ?int i = str.indexOf(oldStr);
? ? ?int n = 0;
? ? ?while(i != -1)
? ? ?{
? ? ? ?str = str.substring(0, i) + newStr + str.substring(i + oldStr.length());
? ? ? ?i = str.indexOf(oldStr, i + newStr.length());
? ? ? ?n++;
? ? ?}
? ? ?return str;
? ?}??
? ?/**
? ? * 字符串替換,左邊第一個(gè)。
? ? * @param str ? ? 源字符串
? ? * @param oldStr ?目標(biāo)字符串
? ? * @param newStr ?替換字符串
? ? * @return ? ? ? ?替換后的字符串
? ? */
? ?static public String replaceFirst(String str, String oldStr, String newStr)
? ?{
? ? ?int i = str.indexOf(oldStr);
? ? ?if (i == -1) return str;
? ? ?str = str.substring(0, i) + newStr + str.substring(i + oldStr.length());
? ? ?return str;
? ?}
? ?System.out.println(StringTools.replaceAll("/","/","http://"));

結(jié)果是/

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • JAVA正則表達(dá)式的基本使用教程

    JAVA正則表達(dá)式的基本使用教程

    這篇文章主要給大家介紹了關(guān)于JAVA正則表達(dá)式的基本使用教程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Java操作SSH2實(shí)現(xiàn)遠(yuǎn)程執(zhí)行l(wèi)inux命令

    Java操作SSH2實(shí)現(xiàn)遠(yuǎn)程執(zhí)行l(wèi)inux命令

    這篇文章主要為大家詳細(xì)介紹了Java如何操作SSH2實(shí)現(xiàn)遠(yuǎn)程執(zhí)行l(wèi)inux命令,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-01-01
  • java配置變量的解釋,搬運(yùn)他人優(yōu)質(zhì)評(píng)論(推薦)

    java配置變量的解釋,搬運(yùn)他人優(yōu)質(zhì)評(píng)論(推薦)

    這篇文章主要介紹了java配置變量,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Java volatile四種內(nèi)存屏障的作用與生效機(jī)制原理詳解

    Java volatile四種內(nèi)存屏障的作用與生效機(jī)制原理詳解

    內(nèi)存屏障是處理器提供的一種指令,用于控制指令執(zhí)行順序和內(nèi)存可見性,在Java中,volatile關(guān)鍵字就是通過(guò)插入內(nèi)存屏障來(lái)實(shí)現(xiàn)其內(nèi)存語(yǔ)義的,下面我將詳細(xì)解釋四種內(nèi)存屏障的含義和工作原理,感興趣的朋友一起看看吧
    2025-09-09
  • Kotlin-Coroutines中的async與await異步協(xié)程管理

    Kotlin-Coroutines中的async與await異步協(xié)程管理

    這篇文章主要為大家介紹了Kotlin-Coroutines中的async與await異步協(xié)程管理,提升程序性能解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • Spring?Boot整合持久層之JPA多數(shù)據(jù)源

    Spring?Boot整合持久層之JPA多數(shù)據(jù)源

    JPA(Java Persistence API)Java 持久化 API,是 Java 持久化的標(biāo)準(zhǔn)規(guī)范,Hibernate 是持久化規(guī)范的技術(shù)實(shí)現(xiàn),而 Spring Data JPA 是在 Hibernate 基礎(chǔ)上封裝的一款框架
    2022-08-08
  • Mybatis中返回主鍵值方式

    Mybatis中返回主鍵值方式

    這篇文章主要介紹了Mybatis中返回主鍵值方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • JavaWeb文件上傳下載功能深入分析(二)

    JavaWeb文件上傳下載功能深入分析(二)

    這篇文章主要為大家詳細(xì)解析了JavaWeb文件上傳與下載功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-06-06
  • JVM的類加載過(guò)程以及雙親委派模型詳解

    JVM的類加載過(guò)程以及雙親委派模型詳解

    這篇文章主要介紹了JVM的類加載過(guò)程以及雙親委派模型詳解,類加載器就是根據(jù)指定全限定名稱將 class 文件加載到 JVM 內(nèi)存,然后再轉(zhuǎn)化為 class 對(duì)象。,需要的朋友可以參考下
    2019-06-06
  • Java中finally和return的關(guān)系實(shí)例解析

    Java中finally和return的關(guān)系實(shí)例解析

    這篇文章主要介紹了Java中finally和return的關(guān)系實(shí)例解析,總結(jié)了二者的關(guān)系,然后分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02

最新評(píng)論