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

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

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

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

如果不是剛剛復習了下正則表達式,我可能也不會注意到,原來String的replaceAll跟replaceFirst用到了正則表達式!

不多解釋,看代碼

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

運行結(jié)果:

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

是不是感覺很神奇?

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

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

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

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

運行結(jié)果: 

my#test.txt

這里給個會被正則表達式識別的字符列表:

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

當然,正則可遠不止這么點,個人建議花點時間去學習一下比較好~

補充:String的split也是用到了正則表達式,使用的時候注意點哦!

replaceAll、replaceFirst使用需要注意的問題

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

java的String類的replaceAll方法是一個挺常用的方法,

類型定義如下

String replaceAll(String regex, String replacement)

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

如果我們這樣寫

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

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

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

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

比如:

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

系統(tǒng)會報:

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

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

系統(tǒng)會報:

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方法。

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

? ?/**
? ? * 字符串替換,從頭到尾查詢一次,替換后的字符串不檢查
? ? * @param str ? ? 源字符串
? ? * @param oldStr ?目標字符串
? ? * @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;
? ?}??
? ?/**
? ? * 字符串替換,左邊第一個。
? ? * @param str ? ? 源字符串
? ? * @param oldStr ?目標字符串
? ? * @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é)果是/

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

相關(guān)文章

  • JAVA正則表達式的基本使用教程

    JAVA正則表達式的基本使用教程

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

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

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

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

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

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

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

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

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

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

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

    Mybatis中返回主鍵值方式

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

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

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

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

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

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

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

最新評論