Java---replace與replaceAll的區別
乍一看,字面上理解好像replace只替換第一個出現的字符(受javaScript的影響),replaceall替換所有的字符,其實大不然,只是替換的用途不一樣。
這兩者很容易搞混,在這里詳細講述下。
我們先看下JAVA_API的說明:
public String replace(char oldChar,char newChar)
使用指定的字面值替換序列替換此字符串所有匹配字面值目標序列的子字符串。該替換從字符串的開頭朝末尾執行,例如,用 "b" 替換字符串 "aaa" 中的 "aa" 將生成 "ba" 而不是 "ab"。
返回一個新的字符串,它是通過用 newChar 替換此字符串中出現的所有 oldChar 而生成的。 如 果 oldChar 在此 String 對象表示的字符序列中沒有出現,則返回對此 String 對象的引用。否則,創建一個新的 String 對象,用來表示與此 String 對象表示的字符序列相等的字符序列,除了每個出現的 oldChar 都被一個 newChar 替換之外。
public String replaceAll(String regex,String replacement)
使用給定的 replacement 字符串替換此字符串匹配給定的正則表達式的每個子字符串。此方法調用的 str.replaceAll(regex, repl) 形式產生與以下表達式完全相同的結果:
Pattern.compile(regex).matcher(str).replaceAll(repl)
參數:
regex – 用來匹配此字符串的正則表達式
返回:得到的 String
拋出: PatternSyntaxException – 如果正則表達式的語法無效。
有一點注意:執行了替換操作后,源字符串的內容是沒有發生改變的.
replace的參數是char和CharSequence,即可以支持字符的替換,也支持字符串的替換(CharSequence即字符串序列的意思,說白了也就是字符串);
replaceAll的參數是regex,即基于規則表達式的替換,比如:可以通過replaceAll("\d", "*")把一個字符串所有的數字字符都換成星號;
相同點:都是全部替換,即把源字符串中的某一字符或字符串全部換成指定的字符或字符串;
不同點:replaceAll支持正則表達式,因此會對參數進行解析(兩個參數均是),如replaceAll("\d", "*"),而replace則不會,replace("\d","*")就是替換"\d"的字符串,而不會解析為正則。
另外,如果replaceAll()和replaceFirst()所用的參數據不是基于規則表達式的,則與replace()替換字符串的效果是一樣的,即這兩者也支持字符串的操作;
用正則表達式僅僅是替換全部或替換第一個的話,用replaceAll或replaceFirst即可。
簡單舉例如下: String src = new String("ab43a2c43d"); System.out.println(src.replace("3","f"));=>ab4f2c4fd. System.out.println(src.replace('3','f'));=>ab4f2c4fd. System.out.println(src.replaceAll("\d","f"));=>abffafcffd. System.out.println(src.replaceAll("a","f"));=>fb43fc23d. System.out.println(src.replaceFirst("\d,"f"));=>abf32c43d System.out.println(src.replaceFirst("4","h"));=>abh32c43d.
另外還有一個不同點:“\”在java中是一個轉義字符,所以需要用兩個代表一個。例如System.out.println( "\" ) ;只打印出一個"\"。但是“\”也是正則表達式中的轉義字符,需要用兩個代表一個。所以:\\被java轉換成\,\又被正則表達式轉換成\,因此用replaceAll替換“\”為"\",就要用replaceAll("\\","\\\\"),而replace則replace("\","\\")。
如果只想替換第一次出現的,可以使用replaceFirst(),這個方法也是基于規則表達式的替換,但與replaceAll()不同的是,只替換第一次出現的字符串。
實際應用:
public static void main(String[] arg) throws OgnlException {
String s =”sdf\a\aa”;
//把s中的反斜杠\ 替換為\
System.out.println(s);
System.out.println(s.replaceAll(“\\”, “\\\\”));
System.out.println(s.replace(“\”, “\\”));
}
性能比較:
如果我們能確定字符串替換,用replace性能略好!如果有大量不確定字符串,replaceAll+正則性能會更好!
(網上整理來的~)
Java 正則表達式
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。