Skip to content

字符串处理常用写法 ​

字符串处理是编程中最常用的操作之一。本文详细介绍字符串处理的常用方法和最佳实践,包含大量实用示例。

📋 目录 ​

🎯 一、字符串拼接 ​

1.1 基本拼接 ​

使用+号拼接:

java
// 简单拼接
String str1 = "Hello" + " " + "World";  // "Hello World"

// 拼接变量
String name = "张三";
String greeting = "你好," + name;  // "你好,张三"

// 拼接数字
int age = 25;
String info = "年龄:" + age;  // "年龄:25"

// 多次拼接(性能较差,不推荐)
String result = "";
for (int i = 0; i < 10; i++) {
    result += i;  // 每次都会创建新对象
}

使用StringBuilder:

java
// 单线程环境推荐使用StringBuilder
StringBuilder sb = new StringBuilder();
sb.append("Hello");
sb.append(" ");
sb.append("World");
String result = sb.toString();  // "Hello World"

// 链式调用
StringBuilder sb2 = new StringBuilder()
    .append("Hello")
    .append(" ")
    .append("World");

// 指定初始容量(性能优化)
StringBuilder sb3 = new StringBuilder(100);

// 插入字符串
sb.insert(5, ",");  // 在索引5位置插入","

// 删除字符
sb.delete(5, 7);  // 删除索引5到7的字符

// 反转字符串
sb.reverse();

使用StringBuffer:

java
// 多线程环境使用StringBuffer(线程安全)
StringBuffer sb = new StringBuffer();
sb.append("Hello");
sb.append(" ");
sb.append("World");
String result = sb.toString();

1.2 Java 8+拼接方式 ​

String.join:

java
// 使用分隔符连接字符串数组
String[] arr = {"a", "b", "c"};
String result = String.join(",", arr);  // "a,b,c"

// 连接List
List<String> list = Arrays.asList("a", "b", "c");
String result2 = String.join("-", list);  // "a-b-c"

// 连接多个字符串
String result3 = String.join(" ", "Hello", "World");  // "Hello World"

StringJoiner:

java
// 使用StringJoiner
StringJoiner sj = new StringJoiner(",");
sj.add("a");
sj.add("b");
sj.add("c");
String result = sj.toString();  // "a,b,c"

// 带前缀和后缀
StringJoiner sj2 = new StringJoiner(",", "[", "]");
sj2.add("a");
sj2.add("b");
String result2 = sj2.toString();  // "[a,b]"

// 空值处理
StringJoiner sj3 = new StringJoiner(",").setEmptyValue("empty");
String result3 = sj3.toString();  // "empty"

Stream拼接:

java
// 使用Stream拼接
List<String> list = Arrays.asList("a", "b", "c");
String result = list.stream()
    .collect(Collectors.joining(","));  // "a,b,c"

// 带前缀和后缀
String result2 = list.stream()
    .collect(Collectors.joining(",", "[", "]"));  // "[a,b,c]"

// 过滤后拼接
String result3 = list.stream()
    .filter(s -> s.length() > 1)
    .collect(Collectors.joining(","));

🎯 二、字符串分割 ​

2.1 split方法 ​

基本分割:

java
// 按单个字符分割
String str = "a,b,c,d";
String[] parts = str.split(",");
// 结果:["a", "b", "c", "d"]

// 按多个字符分割
String str2 = "a;b;c;d";
String[] parts2 = str2.split(";");

// 限制分割次数
String str3 = "a,b,c,d,e";
String[] parts3 = str3.split(",", 3);
// 结果:["a", "b", "c,d,e"]

// 正则表达式分割
String str4 = "a b   c   d";
String[] parts4 = str4.split("\\s+");  // 按空白字符分割
// 结果:["a", "b", "c", "d"]

特殊情况处理:

java
// 处理前后空白
String str = " a , b , c ";
String[] parts = str.split(",");
// 结果:[" a ", " b ", " c "]

// 分割后去除空白
String[] trimmed = Arrays.stream(str.split(","))
    .map(String::trim)
    .toArray(String[]::new);
// 结果:["a", "b", "c"]

// 过滤空字符串
String str2 = "a,,b,,c";
String[] filtered = Arrays.stream(str2.split(","))
    .filter(s -> !s.isEmpty())
    .toArray(String[]::new);
// 结果:["a", "b", "c"]

2.2 使用Pattern分割 ​

java
// 使用Pattern分割
Pattern pattern = Pattern.compile(",");
String str = "a,b,c,d";
String[] parts = pattern.split(str);

// 限制分割次数
String[] parts2 = pattern.split(str, 2);

2.3 StringTokenizer(已过时,不推荐) ​

java
// StringTokenizer使用(仅作了解,不推荐使用)
StringTokenizer tokenizer = new StringTokenizer("a,b,c", ",");
while (tokenizer.hasMoreTokens()) {
    String token = tokenizer.nextToken();
    System.out.println(token);
}

🎯 三、字符串格式化 ​

3.1 String.format ​

基本格式化:

java
// 格式化字符串
String formatted = String.format("姓名:%s,年龄:%d", "张三", 25);
// 结果:"姓名:张三,年龄:25"

// 格式化数字
String num1 = String.format("%d", 123);           // "123"
String num2 = String.format("%05d", 123);         // "00123"
String num3 = String.format("%.2f", 3.14159);     // "3.14"
String num4 = String.format("%,d", 1000000);      // "1,000,000"

// 格式化日期
Date date = new Date();
String dateStr = String.format("%tY-%tm-%td", date, date, date);
// 结果:"2024-01-01"

// 左对齐和右对齐
String left = String.format("%-10s", "Hello");    // "Hello     "
String right = String.format("%10s", "Hello");    // "     Hello"

格式化占位符:

java
// %s - 字符串
String.format("Hello %s", "World");  // "Hello World"

// %d - 整数
String.format("Age: %d", 25);  // "Age: 25"

// %f - 浮点数
String.format("Price: %.2f", 99.99);  // "Price: 99.99"

// %c - 字符
String.format("Char: %c", 'A');  // "Char: A"

// %b - 布尔值
String.format("Flag: %b", true);  // "Flag: true"

// %x - 十六进制
String.format("Hex: %x", 255);  // "Hex: ff"

// %o - 八进制
String.format("Oct: %o", 64);  // "Oct: 100"

3.2 MessageFormat ​

MessageFormat使用:

java
// 格式化消息
String pattern = "姓名:{0},年龄:{1}";
String message = MessageFormat.format(pattern, "张三", 25);
// 结果:"姓名:张三,年龄:25"

// 格式化日期
String datePattern = "日期:{0,date,yyyy-MM-dd}";
String dateMsg = MessageFormat.format(datePattern, new Date());

// 格式化数字
String numPattern = "价格:{0,number,currency}";
String numMsg = MessageFormat.format(numPattern, 99.99);

// 格式化选择
String choicePattern = "性别:{0,choice,0#未知|1#男|2#女}";
String choiceMsg = MessageFormat.format(choicePattern, 1);
// 结果:"性别:男"

🎯 四、字符串校验 ​

4.1 空值判断 ​

判断空字符串:

java
String str = "";

// 判断是否为空
boolean isEmpty = str.isEmpty();           // true
boolean isEmpty2 = str.length() == 0;      // true

// 判断是否为null或空
boolean isNullOrEmpty = str == null || str.isEmpty();

// Java 11+
boolean isBlank = str.isBlank();           // true(包含空白字符)

// Apache Commons Lang
boolean isBlank2 = StringUtils.isBlank(str);  // true
boolean isEmpty3 = StringUtils.isEmpty(str);  // true

空值安全处理:

java
String str = null;

// 避免空指针
if (str != null && str.length() > 0) {
    // 安全操作
}

// 使用Optional
Optional<String> optional = Optional.ofNullable(str);
String result = optional.orElse("default");

// 使用三元运算符
String result2 = str != null ? str : "default";

// Java 8+
String result3 = Optional.ofNullable(str)
    .filter(s -> !s.isEmpty())
    .orElse("default");

4.2 字符串匹配 ​

正则表达式匹配:

java
String str = "hello123";

// 是否匹配正则
boolean matches = str.matches("\\w+");  // true

// 使用Pattern
Pattern pattern = Pattern.compile("\\d+");
Matcher matcher = pattern.matcher(str);
boolean found = matcher.find();  // true

// 查找所有匹配
List<String> matches = new ArrayList<>();
while (matcher.find()) {
    matches.add(matcher.group());
}

字符串包含:

java
String str = "Hello World";

// 判断包含
boolean contains = str.contains("World");  // true

// 判断开头
boolean startsWith = str.startsWith("Hello");  // true

// 判断结尾
boolean endsWith = str.endsWith("World");  // true

// 忽略大小写
boolean equalsIgnoreCase = str.equalsIgnoreCase("hello world");  // true

4.3 字符串校验工具类 ​

常用校验方法:

java
// 邮箱校验
public boolean isValidEmail(String email) {
    return email != null && email.matches("^[A-Za-z0-9+_.-]+@(.+)$");
}

// 手机号校验
public boolean isValidPhone(String phone) {
    return phone != null && phone.matches("^1[3-9]\\d{9}$");
}

// 身份证号校验
public boolean isValidIdCard(String idCard) {
    return idCard != null && idCard.matches("^\\d{17}[\\dXx]$");
}

// URL校验
public boolean isValidUrl(String url) {
    try {
        new URL(url);
        return true;
    } catch (MalformedURLException e) {
        return false;
    }
}

🎯 五、字符串转换 ​

5.1 大小写转换 ​

java
String str = "Hello World";

// 转大写
String upper = str.toUpperCase();  // "HELLO WORLD"

// 转小写
String lower = str.toLowerCase();  // "hello world"

// 首字母大写
String capitalized = str.substring(0, 1).toUpperCase() + 
                    str.substring(1).toLowerCase();

// 单词首字母大写(简单版)
String[] words = str.toLowerCase().split(" ");
StringBuilder sb = new StringBuilder();
for (String word : words) {
    if (sb.length() > 0) sb.append(" ");
    sb.append(word.substring(0, 1).toUpperCase())
      .append(word.substring(1));
}
String titleCase = sb.toString();  // "Hello World"

5.2 字符串和数字转换 ​

字符串转数字:

java
// String转int
String str = "123";
int num1 = Integer.parseInt(str);
int num2 = Integer.valueOf(str);  // 返回Integer对象

// 带默认值
int num3 = Integer.parseInt(str, 10);  // 指定进制

// 安全转换
int num4;
try {
    num4 = Integer.parseInt(str);
} catch (NumberFormatException e) {
    num4 = 0;  // 默认值
}

// String转double
String str2 = "3.14";
double d = Double.parseDouble(str2);

数字转字符串:

java
int num = 123;

// 基本转换
String str1 = String.valueOf(num);     // "123"
String str2 = Integer.toString(num);   // "123"
String str3 = "" + num;                // "123"(不推荐)

// 格式化转换
String str4 = String.format("%05d", num);  // "00123"
String str5 = String.format("%x", num);    // "7b"(十六进制)

// 使用StringBuilder
StringBuilder sb = new StringBuilder();
sb.append(num);
String str6 = sb.toString();

5.3 字符串和数组转换 ​

java
// 字符串转字符数组
String str = "Hello";
char[] chars = str.toCharArray();

// 字符数组转字符串
char[] chars2 = {'H', 'e', 'l', 'l', 'o'};
String str2 = new String(chars2);
String str3 = String.valueOf(chars2);

// 字符串转字节数组
byte[] bytes = str.getBytes();
byte[] bytes2 = str.getBytes(StandardCharsets.UTF_8);

// 字节数组转字符串
String str4 = new String(bytes);
String str5 = new String(bytes2, StandardCharsets.UTF_8);

🎯 六、字符串查找和替换 ​

6.1 查找操作 ​

查找字符串:

java
String str = "Hello World Hello";

// 查找索引
int index1 = str.indexOf("Hello");      // 0
int index2 = str.indexOf("Hello", 1);   // 12(从索引1开始查找)
int lastIndex = str.lastIndexOf("Hello"); // 12

// 查找字符
int charIndex = str.indexOf('W');       // 6

// 查找所有匹配位置
List<Integer> indices = new ArrayList<>();
int index = -1;
while ((index = str.indexOf("Hello", index + 1)) != -1) {
    indices.add(index);
}
// 结果:[0, 12]

正则查找:

java
String str = "abc123def456";

// 使用正则查找
Pattern pattern = Pattern.compile("\\d+");
Matcher matcher = pattern.matcher(str);
while (matcher.find()) {
    System.out.println("找到: " + matcher.group() + " 位置: " + matcher.start());
}
// 输出:
// 找到: 123 位置: 3
// 找到: 456 位置: 9

6.2 替换操作 ​

基本替换:

java
String str = "Hello World";

// 替换所有
String replaced1 = str.replace("World", "Java");  // "Hello Java"
String replaced2 = str.replace('l', 'L');         // "HeLLo WorLd"

// 替换第一个
String replaced3 = str.replaceFirst("l", "L");    // "HeLlo World"

// 正则替换
String replaced4 = str.replaceAll("\\s+", "-");   // "Hello-World"

正则替换:

java
String str = "abc123def456";

// 替换所有数字
String replaced1 = str.replaceAll("\\d+", "***");  // "abc***def***"

// 替换并引用分组
String replaced2 = str.replaceAll("(\\d+)", "[$1]");  // "abc[123]def[456]"

// 使用Pattern替换
Pattern pattern = Pattern.compile("\\d+");
String replaced3 = pattern.matcher(str).replaceAll("X");

🎯 七、字符串其他操作 ​

7.1 字符串截取 ​

java
String str = "Hello World";

// 基本截取
String sub1 = str.substring(6);        // "World"
String sub2 = str.substring(0, 5);     // "Hello"

// 按长度截取
String sub3 = str.substring(0, Math.min(5, str.length()));

// 安全截取(防止越界)
public String safeSubstring(String str, int start, int end) {
    if (str == null) return "";
    int len = str.length();
    start = Math.max(0, Math.min(start, len));
    end = Math.max(start, Math.min(end, len));
    return str.substring(start, end);
}

7.2 字符串填充 ​

java
// 左填充
String str = "123";
String leftPadded = String.format("%05d", Integer.parseInt(str));  // "00123"

// 右填充
String rightPadded = String.format("%-5s", str);  // "123  "

// 使用Apache Commons Lang
StringUtils.leftPad(str, 5, '0');   // "00123"
StringUtils.rightPad(str, 5, ' ');  // "123  "

7.3 字符串去重和排序 ​

java
// 字符去重
String str = "aabbccdd";
String unique = Arrays.stream(str.split(""))
    .distinct()
    .collect(Collectors.joining());  // "abcd"

// 字符排序
String sorted = str.chars()
    .sorted()
    .mapToObj(c -> String.valueOf((char) c))
    .collect(Collectors.joining());  // "aabbccdd"

📖 学习资源 ​

官方文档 ​

工具库 ​

✅ 学习检查清单 ​

  • [ ] 已掌握字符串拼接的各种方法
  • [ ] 已掌握字符串分割操作
  • [ ] 已熟悉字符串格式化
  • [ ] 已掌握字符串校验方法
  • [ ] 已了解字符串转换操作
  • [ ] 已掌握字符串查找和替换

上一章节:集合操作常用写法
下一章节:日期时间处理常用写法
返回目录:代码规范