首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Java 字串處理實戰技巧:替換、分割、全半角轉換工具類完整實作

     編輯:Java 程式設計入門

前言

字串處理是業務開發高頻需求。本文整理實戰中常用的字串替換、多模式分割、全半角轉換工具方法,提供生產級代碼實作與設計考量。

一、字串替換:遞歸實現與效能考量


/**
 * 字串替換:將 source 中所有 beRepStr 替換為 repStr
 * @param source 原字串
 * @param beRepStr 被替換子串
 * @param repStr 替換目標串
 * @return 替換後字串
 */
public static String replaceStr(String source, String beRepStr, String repStr) {
    if (source == null || beRepStr == null || beRepStr.isEmpty()) {
        return source;
    }
    int index = source.indexOf(beRepStr);
    if (index < 0) {
        return source;
    }
    
    StringBuilder sb = new StringBuilder();
    int lastEnd = 0;
    while (index >= 0) {
        sb.append(source, lastEnd, index);
        sb.append(repStr);
        lastEnd = index + beRepStr.length();
        index = source.indexOf(beRepStr, lastEnd);
    }
    sb.append(source, lastEnd, source.length());
    return sb.toString();
}

設計要點

  • 避免遞歸:原代碼遞歸易造成 StackOverflowError,改用迴圈 + StringBuilder
  • 單次遍歷:indexOf(str, fromIndex) 避免重複掃描
  • 邊界處理:空字串、null、被替換串為空的防禦性檢查
  • 效能:O(n) 時間複雜度,單次分配 StringBuilder

生產建議:實際專案優先使用 String.replace(CharSequence, CharSequence)(Java 5+)或 Apache Commons Lang StringUtils.replace(),經過高度優化且處理邊界情況完善。

二、多模式字串分割:智慧分隔符檢測


/**
 * 智慧分割:自動檢測分隔符(空白鍵 或 #)
 * @param test 待分割字串
 * @param sep 預設分隔符
 * @return 分割後陣列
 */
public static String[] getFields(String test, String sep) {
    if (test == null) return new String[0];
    
    // 智慧檢測分隔符邏輯
    int spaceIdx = test.indexOf(' ');
    int hashIdx = test.indexOf('#');
    
    if (spaceIdx != -1) {
        if (hashIdx != -1 && spaceIdx > hashIdx) {
            sep = "#";  // # 出現較早,優先作為分隔符
        }
    } else {
        sep = "#";  // 無空白則用 #
    }
    
    if (" ".equals(sep)) {
        // 空白分割:連續空白視為單一分隔,去除首尾空白
        return test.trim().split("\\s+");
    } else {
        // # 分割:保留空欄位行為由 split 決定
        return test.trim().split("#");
    }
}

場景適用性

  • 相容舊資料格式:同欄位可能用空白或 # 分隔
  • trim() 移除首尾干擾字元
  • \\s+ 正則處理連續空白、Tab 等

三、全半角轉換:基於 Unicode 碼位運算

原理

  • 全角字元 Unicode 範圍:U+FF01 (!) ~ U+FF5E (~)
  • 半角對應:U+0021 (!) ~ U+007E (~)
  • 碼位差值:65248 (0xFEE0)
  • 空白字元特殊:全角 U+3000 → 半角 U+0020,差值 12288

半角轉全角 (DBC → SBC)


public static String toFullWidth(String input) {
    if (input == null) return null;
    char[] chars = input.toCharArray();
    for (int i = 0; i < chars.length; i++) {
        char c = chars[i];
        if (c == ' ') {  // 半角空白
            chars[i] = '\u3000';
        } else if (c >= '\u0021' && c <= '\u007E') {  // 可見半角字元
            chars[i] = (char) (c + 0xFEE0);
        }
    }
    return new String(chars);
}

全角轉半角 (SBC → DBC)


public static String toHalfWidth(String input) {
    if (input == null) return null;
    char[] chars = input.toCharArray();
    for (int i = 0; i < chars.length; i++) {
        char c = chars[i];
        if (c == '\u3000') {  // 全角空白
            chars[i] = ' ';
        } else if (c >= '\uFF01' && c <= '\uFF5E') {  // 可見全角字元
            chars[i] = (char) (c - 0xFEE0);
        }
    }
    return new String(chars);
}

優於原代碼的改進

原代碼問題改進方案
逐字 getBytes("unicode") 極慢直接 char 陣列運算,零物件分配
依賴特定位元組位置 (b[2], b[3]) 不可移植基於 Unicode 碼位標準,跨平台一致
字串連接 outStr += ... 產生大量垃圾char 陣列就地修改,單次 new String
未處理空白字元特殊映射額外處理 U+3000 ↔ U+0020

四、完整工具類與測試


public final class StringUtils {
    private StringUtils() {}  // 工具類禁止實例化
    
    // 上述三個公開靜態方法...
    
    public static void main(String[] args) {
        // 全半角測試
        String half = "#@$%^&*()";
        String full = "#@$%^&*()";
        System.out.println("半轉全: " + half + " → " + toFullWidth(half));
        System.out.println("全轉半: " + full + " → " + toHalfWidth(full));
        
        // 分割測試
        String[] r1 = getFields("23#99#99#99", "#");
        String[] r2 = getFields("a b  c   d", " ");
        System.out.println("#分割: " + Arrays.toString(r1));
        System.out.println("空白分割: " + Arrays.toString(r2));
        
        // 替換測試
        System.out.println("替換: " + replaceStr("a,b,c", ",", "|"));
    }
}

結語

字串處理看似基礎,實則藏著效能陷阱與邊界陷阱。掌握 StringBuilder、char[] 直接操作、Unicode 碼位運算等核心技術,能寫出高效、正確、可維護的工具代碼。實際專案中,優先考慮成熟庫(Guava, Commons Lang, Apache Text),僅在特殊業務邏輯下自行實作。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved