嘗試使用 replaceAll("*","") 移除字串中的星號,但無效果甚至報錯。
String text = "abc*def*ghi";
text = text.replaceAll("*", ""); // 錯誤:PatternSyntaxException
text = text.replaceAll("*", null); // 錯誤:參數類型不符
String.replaceAll(String regex, String replacement) 的第一個參數是正則表達式。星號 * 在正則中是元字符(表示「前一字符出現 0 次或多次」),單獨使用會導致語法錯誤。
String text = "abc*def*ghi";
text = text.replace("*", ""); // 直接字串替換,不解析正則
// 結果: "abcdefghi"
replace(CharSequence target, CharSequence replacement) 參數視為字面字串,不處理正則,效能也較好。
// 寫法 1:字符類別
text = text.replaceAll("[*]", "");
// 寫法 2:反斜線轉義(需雙重轉義)
text = text.replaceAll("\\*", "");
// Java 字串中 \\ 代表單一反斜線,正則引擎收到 \* 視為字面星號
text = text.replaceAll(Pattern.quote("*"), "");
// 適用於動態字串替換,自動處理所有特殊字符
| 方法 | 是否解析正則 | 效能 | 適用場景 |
|---|---|---|---|
replace() | 否 | 最快 | 固定字串替換、單字符替換 |
replaceAll("[*]") | 是 | 中等 | 需正則功能時 |
replaceAll("\\*") | 是 | 中等 | 需正則功能時 |
Pattern.quote() | 是 | 稍慢 | 動態/未知字串替換 |
特殊字符: . * + ? ^ $ { } [ ] ( ) | \
轉義寫法: \. \* \+ \? \^ \$ \{ \} \[ \] \( \) \| \\
字符類別: [.] [*] [+] [?] [^] [$] [{] [}] [[] []] [(] [)] [|] [\]
替換星號等特殊字符時,優先使用 replace(),簡單高效不解析正則。若必須用 replaceAll(),請用字符類別 [*] 或轉義 \\*。記住:replaceAll 參數是正則,replace 參數是字面字串。