標籤:
JAVA 中的 replace replaceAll
問題:
測試code
System.out.println("1234567890abcdef -----> "+"1234567890abcdef".replace("12345", "ABCDE"));
System.out.println("1234567890abcdef -----> "+"1234567890abcdef".replaceAll("12345", "ABCDE"));
System.out.println("[email protected]#$%^&*()-=Abcd -----> "+"[email protected]#$%^&*()-=Abcd".replace("#$%^&", "OK"));
System.out.println("[email protected]#$%^&*()-=Abcd -----> "+"[email protected]#$%^&*()-=Abcd".replaceAll("#$%^&", "OK"));
執行結果:
1234567890abcdef -----> ABCDE67890abcdef Replace 將目標代碼成功替換
1234567890abcdef -----> ABCDE67890abcdef ReplaceAll 也將目標代碼成功替換
[email protected]#$%^&*()-=Abcd -----> [email protected]*()-=Abcd Replace 將目標代碼成功替換
[email protected]#$%^&*()-=Abcd -----> [email protected]#$%^&*()-=Abcd ReplaceAll 目標代碼替換 失敗
可以明顯發現,String.ReplaceAll 在對特殊字元的替換上與String.Replace 存在一定的差異。
定義:
replace
public String replace(CharSequence target, CharSequence replacement)
-
使用指定的字面值替換序列替換此字串所有匹配字面值目標序列的子字串。該替換從字串的開頭朝末尾執行,例如,用 "b" 替換字串 "aaa" 中的 "aa" 將產生 "ba" 而不是 "ab"。
-
-
-
參數:
-
target - 要被替換的 char 值序列
-
replacement - char 值的替換序列
-
返回:
-
所得 String
-
拋出:
-
NullPointerException
- 如果 target 或 replacement 為 null。
replaceAll
public String replaceAll(String regex, String replacement)
-
使用給定的 replacement 替換此字串所有匹配給定的Regex的子字串。
調用此方法的 str.replaceAll(regex, repl) 形式與以下運算式產生的結果完全相同:
Pattern.compile(
regex).matcher(
str).replaceAll(
repl)
注意,在替代字串中使用反斜線 (\) 和貨幣符號 ($) 與將其視為字面值替代字串所得的結果可能不同;請參閱 Matcher.replaceAll。如有需要,可使用 Matcher.quoteReplacement(java.lang.String)
取消這些字元的特殊含義。
-
-
-
參數:
-
regex - 用來匹配此字串的Regex
-
replacement - 用來替換每個匹配項的字串
-
返回:
-
所得 String
-
拋出:
-
PatternSyntaxException - 如果Regex的文法無效
可以發現String.Replace 主要是針對字串的替換,String.ReplaceAll 主要是用Regex的子字串進行替換。所以對在使用String.ReplaceAll 時,不能和String.Replace 方法一起使用。
可以String.ReplaceAll (Pattern.quote("str1"),"str2");
即:
System.out.println("1234567890abcdef -----> "+"1234567890abcdef".replace("12345", "ABCDE"));
System.out.println("1234567890abcdef -----> "+"1234567890abcdef".replaceAll("12345", "ABCDE"));
System.out.println("[email protected]#$%^&*()-=Abcd -----> "+"[email protected]#$%^&*()-=Abcd".replace("#$%^&", "OK"));
System.out.println("[email protected]#$%^&*()-=Abcd -----> "+"[email protected]#$%^&*()-=Abcd".replaceAll(Pattern.quote("#$%^&"), "OK"));
JAVASCRIPT 中的 replace 不提供 replaceAll
stringObj.replace(rgExp, replaceText)
參數
stringObj
必選項。要執行該替換的 String 對象或字串文字。該字串不會被 replace 方法修改。
rgExp
必選項。為包含Regex模式或可用標誌的Regex對象。也可以是 String 對象或文字。如果 rgExp 不是Regex對象,它將被轉換為字串,並進行精確的尋找;不要嘗試將字串轉化為Regex。
replaceText
必選項。是一個String 對象或字串文字,對於stringObj 中每個匹配 rgExp 中的位置都用該對象所包含的文字加以替換。在 Jscript 5.5 或更新版本中,replaceText 參數也可以是返回替換文本的函數。
說明
replace 方法的結果是一個完成了指定替換的 stringObj 對象的複製。
下面任意的匹配變數都能用來識別最新的匹配以及找出匹配的字串。在需要動態決定替換字串的文本替換中可以使用匹配變數。
字元 含義
$$ $ (JScript 5.5 或更新版本)
$& 指定與整個模式比對的 stringObj 的部分。 (JScript 5.5 或更新版本)
$` 指定由 $& 描述的匹配之前的 stringObj 部分。 (JScript 5.5 或更新版本)
$‘ 指定由 $& 描述的匹配之後的 stringObj 部分。 (JScript 5.5 或更新版本)
$n 捕獲的第 n 個子匹配,此處 n 為從1到9的十進位一位元。 (JScript 5.5 或更新版本)
$nn 捕獲的第 nn 個子匹配,此處 nn 為從01到99的十進位兩位元。 (JScript 5.5 或更新版本)
如果 replaceText 為函數,對於每一個匹配的子字串,調用該函數時帶有下面的 m+3 個參數,此處 m 是在 rgExp 中捕獲的左括弧的個數。第一個參數是匹配的子字串。接下來的 m 個參數是尋找中捕獲的全部結果。第 m+2 個參數是在 stringObj 中匹配出現的位移量,而第 m+3 個參數為 stringObj。結果為將每一匹配的子字串替換為函數調用的相應傳回值的字串值。
Replace 方法更新全域 RegExp 對象的屬性。
樣本
下面的樣本示範了 replace 方法將第一次出現的單詞 "The" 替換為單詞 "A" 的用法。
function ReplaceDemo(){
var r, re; // 聲明變數。
var ss = "The man hit the ball with the bat.n";
ss += "while the fielder caught the ball with the glove.";
re = /The/g; // 建立Regex模式。
r = ss.replace(re, "A"); // 用 "A" 替換 "The"。
return(r); // 返回替換後的字串。
}
得到結果:A man hit the ball with the bat.nwhile the fielder caught the ball with the glove.
另外, replace 方法也可以替換模式中的子運算式。 下面的範例示範了交換字串中的每一對單詞:
function ReplaceDemo(){
var r, re; // 聲明變數。
var ss = "The rain in Spain falls mainly in the plain.";
re = /(\S+)(\s+)(\S+)/g; // 建立Regex模式。
r = ss.replace(re, "$3$2$1"); // 交換每一對單詞。
return(r); // 返回結果字串。
}
得到結果:rain The Spain in mainly falls the in plain.
下面的樣本(在 JScript 5.5 及更新版本中執行)執行的是從華氏到攝氏的轉換,它示範了使用函數作為 replaceText。要想知道該函數是如何工作的,傳遞一個包含數值的字串,數值後要緊跟 "F" (例如 "Water boils at 212")。
var s = "Water freezes at 32F and boils at 212F."
var test = /(d+(.d*)?)Fb/g; // 初始化模式。
return(s.replace
(test,
function($0,$1,$2) {
return((($1-32) * 5/9) + "C");
}
)
);
得到結果:Water freezes at 0C and boils at 100C.
js居然不提供replaceAll方法,用for迴圈又有效率問題,給你一個Regex的解決方案
js 代碼
String.prototype.replaceAll = function(s1,s2){
return this.replace(new RegExp(s1,"gm"),s2);
}
方法: string.replace(new RegExp(oldString,"gm"),newString))
gm g=global, m=multiLine , 大致上方法就是這樣的,可以實現替換全部指定字串
另一個簡單的驗證JS的方法:
在瀏覽器地址欄輸入
javascript:alert("abcabcabc".replace(new RegExp("a","gm"),"ad"))
這樣比較省事 ;) ,不知道多行的會不會很方便
orgStr.replace(new RegExp(findStr, ‘g‘), replaceStr)
應該就可以替換所有的了
如果不用Regex
orgStr.replace(findStr, replaceStr)只能替換第一個
& 替代<,>,",‘,&
*/
function toTxt(str){
var RexStr = /\<|\>|\"|\‘|\&/g
str = str.replace(RexStr,
function(MatchStr){
switch(MatchStr){
case "<":
return "& lt;";
break;
case ">":
return "& gt;";
break;
case "\"":
return "& quot;";
break;
case "‘":
return "& #39;";
break;
case "&":
return "& amp;";
break;
default :
break;
}
}
)
return str;
}
[轉]String.Replace 和 String.ReplaceAll 的區別