這篇文章將為大家詳細講解有關(guān)String.replaceAll方法有什么用,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
創(chuàng)新互聯(lián)專注于呼倫貝爾網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗。 熱誠為您提供呼倫貝爾營銷型網(wǎng)站建設(shè),呼倫貝爾網(wǎng)站制作、呼倫貝爾網(wǎng)頁設(shè)計、呼倫貝爾網(wǎng)站官網(wǎng)定制、微信小程序定制開發(fā)服務(wù),打造呼倫貝爾網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供呼倫貝爾網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。
示例
String str1 = "createTime"; String str2 = "createTimeAt"; String regex = "([A-Z])+"; System.out.println(str1.replaceAll(regex, "_$1").toLowerCase()); System.out.println(str2.replaceAll(regex, "_$1").toLowerCase()); //result //create_time //create_time_at
通過輸出可以看到,這段代碼的作用是把駝峰命名格式的字符串替換成下劃線分割,這個功能比較簡單,但是吸引我的卻是他的代碼。
"createTime".replaceAll("([A-Z]+)","_$1")
這行代碼簡單的很,就是調(diào)用了String類的replaceAll方法,方法的第一個參數(shù)是正則表達式,第二個參數(shù)是將要被替換成的新值。
讓我驚奇的是他代碼中,replaceAll的第二個參數(shù),也就是JDK文檔中名為replacement的參數(shù),竟然是_$1。這是什么鬼?還支持類似占位符這樣的東西?我一直都不知道。
問題探索
由于之前研究過一段正則表達式,通過觀察replaceAll的第一個參數(shù)([A-Z]+),我猜想,這個應(yīng)該是用到了正則表達式的分組,對應(yīng)JDK中,就是java.util.regex.Matcher類的group()方法。
在Linux的Sed命令上,就使用&進行了一些替換,道理應(yīng)該是相通的。
于是看了下String.replaceAll方法是如何實現(xiàn)的。JDK:
public String replaceAll(String regex, String replacement) { return Pattern.compile(regex).matcher(this).replaceAll(replacement); }
哦,原來它底層就是用了Matcher,只不過用的是Matcher自己的replaceAll方法。
去看它的文檔,這個方法的參數(shù)果然有鬼,看下面實現(xiàn)代碼。
public String replaceAll(String replacement) { reset(); boolean result = find(); if (result) { StringBuilder sb = new StringBuilder(); do { appendReplacement(sb, replacement); result = find(); } while (result); appendTail(sb); return sb.toString(); } return text.toString(); }
里面關(guān)鍵的部分就是文檔中說的appendReplacement方法,然后可以看到詳細的描述文檔。
看到這里明白了,原來這個方法的replacement參數(shù)可以通過$字符來指代Matcher通過正則匹配得到的分組,支持name和number 兩種方式,這里對應(yīng)的就是Matcher類的group(name)和group(int)兩個方法。
結(jié)論
1、String的replaceAll方法實際上是通過java.util.regex.Matcher類的replaceAll()方法實現(xiàn)的。
2、java.util.regex.Matcher類的replaceAll方法又是通過調(diào)用appendReplacement方法實現(xiàn)替換邏輯
3、Matcher類的appendReplacement方法的replacement參數(shù)支持通過$符號來指代Matcher匹配的分組
下面這串代碼,就是使用Matcher類分組的一個最佳實踐。
String data = "哈哈哈,xjjdog的手機號碼是:12345678901,你會打給我嗎"; //通過Matcher的分組功能,可以提取出上面字符串中的手機號 Matcher matcher = Pattern.compile(".*(xjjdog的手機號碼是:([0-9]{11}))").matcher(data); while (matcher.find()) { System.out.println("G0:" + matcher.group(0)); System.out.println("G1:" + matcher.group(1)); System.out.println("G2:" + matcher.group(2)); } //result //G0:哈哈哈,xjjdog的手機號碼是:12345678901 //G1:xjjdog的手機號碼是:12345678901 //G2:12345678901
group(0)表示整個字符串
group(1)表示第一個匹配的,上面的例子中就是(我的手機號碼是:([0-9]{11}))部分
group(2)表示第二個匹配的,上面的例子中就是([0-9]{11})部分
使用分組可以用來提取字符串中的目標(biāo)字符串值,很好用!
幾個例子
下面是幾個例子,大家可以觸類旁通。
駝峰轉(zhuǎn)下劃線命名
public static String camelToUnderline(String camelName) { return camelName.replaceAll("([A-Z]+)", "_$1").toLowerCase(); }
下劃線轉(zhuǎn)駝峰
這個稍微麻煩點,是模仿者Matcher.replaceAll方法寫的。
public static String underlineToCamel(String underlineName) { Matcher matcher = Pattern.compile("(_[a-z]{1})").matcher(underlineName); StringBuffer result = new StringBuffer(); while (matcher.find()) { String replacement = matcher.group(1); matcher.appendReplacement(result, replacement.replace("_", "").toUpperCase()); } matcher.appendTail(result); return result.toString(); }
另外,Mybatis Generator插件源碼中的也提供了類似方法(JavaBeansUtil.getCamelCaseString),這里做了下簡單修改
public static String getCamelCaseString(String inputString) { StringBuilder sb = new StringBuilder(); boolean nextUpperCase = false; for (int i = 0; i < inputString.length(); i++) { char c = inputString.charAt(i); switch (c) { case '_': case '-': case '@': case '$': case '#': case ' ': case '/': case '&': if (sb.length() > 0) { nextUpperCase = true; } break; default: if (nextUpperCase) { sb.append(Character.toUpperCase(c)); nextUpperCase = false; } else { sb.append(Character.toLowerCase(c)); } break; } } return sb.toString(); }
關(guān)于“String.replaceAll方法有什么用”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。