在 Java 中,检查一个 String 是否包含特定字符或字符序列,有多种方法,下面我将为你详细介绍最常用和最推荐的方法,并附上代码示例。

检查是否包含单个字符
这是最基础的需求,最简单的方法是使用 String.indexOf(char) 方法。
使用 indexOf(char)
indexOf(char ch) 方法会查找字符 ch 在字符串中第一次出现的位置,如果找到,返回该位置的索引(从0开始);如果找不到,则返回 -1。
public class ContainsCharExample {
public static void main(String[] args) {
String str = "Hello, World!";
// 要检查的字符
char targetChar = 'W';
// 使用 indexOf 检查
int index = str.indexOf(targetChar);
if (index != -1) {
System.out.println("字符串 '" + str + "' 包含字符 '" + targetChar + "'。");
System.out.println("字符 '" + targetChar + "' 的位置是: " + index);
} else {
System.out.println("字符串 '" + str + "' 不包含字符 '" + targetChar + "'。");
}
// 检查一个不存在的字符
char nonExistentChar = 'z';
if (str.indexOf(nonExistentChar) == -1) {
System.out.println("字符串 '" + str + "' 不包含字符 '" + nonExistentChar + "'。");
}
}
}
输出:
字符串 'Hello, World!' 包含字符 'W'。
字符 'W' 的位置是: 7
字符串 'Hello, World!' 不包含字符 'z'。
使用 contains(CharSequence) (推荐)
如果你只是想知道“是否包含”,而不关心位置,使用 String.contains(CharSequence) 方法会更直观、更符合语义,这个方法返回一个 boolean 值。

注意:参数是 CharSequence,所以你可以直接传入一个 String,contains("W")。
public class ContainsCharExample2 {
public static void main(String[] args) {
String str = "Hello, World!";
// 检查单个字符(将其作为字符串传入)
boolean containsW = str.contains("W");
System.out.println("字符串是否包含 'W'? " + containsW); // true
boolean containsZ = str.contains("z");
System.out.println("字符串是否包含 'z'? " + containsZ); // false
}
}
输出:
字符串是否包含 'W'? true
字符串是否包含 'z'? false
- 用
indexOf()如果你需要知道字符的位置。 - 用
contains()如果你只需要一个是/否的答案,代码可读性更高。
检查是否包含任意一个字符(来自一个字符集合)
如果你想检查字符串是否包含来自某个特定字符集合("aeiou")中的任意一个字符,有几种高效的方法。
使用正则表达式 (最简洁)
这是最现代、最简洁的方法,使用正则表达式的 (或) 操作符。

public class ContainsAnyCharExample {
public static void main(String[] args) {
String str = "This is a test sentence.";
String vowels = "aeiou";
// 使用正则表达式,[]表示字符集,^表示非
// 模式 "[aeiou]" 表示匹配 a, e, i, o, u 中的任意一个
boolean hasVowel = str.matches(".*[aeiou].*");
System.out.println("字符串是否包含至少一个元音? " + hasVowel); // true
String noVowelStr = "Ths s tst sntnc.";
boolean hasVowel2 = noVowelStr.matches(".*[aeiou].*");
System.out.println("字符串是否包含至少一个元音? " + hasVowel2); // false
}
}
解释:
- 匹配任意字符(除换行符)零次或多次。
[aeiou]:一个字符集,匹配a,e,i,o,u中的任意一个。.*[aeiou].*:整个模式的含义是:字符串的开头可以是任意内容,中间必须有aeiou中的一个字符,结尾也可以是任意内容。
使用 Java 8 Stream API (函数式风格)
如果你喜欢函数式编程,可以使用 String.chars() 和 anyMatch()。
import java.util.stream.IntStream;
public class ContainsAnyCharExample2 {
public static void main(String[] args) {
String str = "This is a test sentence.";
String vowels = "aeiou";
// 将字符串转换为字符流,然后检查是否有任何一个字符存在于vowels字符串中
boolean hasVowel = IntStream.range(0, str.length())
.anyMatch(i -> vowels.indexOf(str.charAt(i)) != -1);
System.out.println("字符串是否包含至少一个元音? " + hasVowel); // true
}
}
解释:
IntStream.range(0, str.length()):创建一个从0到字符串长度-1的整数流。.anyMatch(...):流中的任意一个元素满足条件就返回true并停止处理。vowels.indexOf(str.charAt(i)) != -1:检查当前字符str.charAt(i)是否在vowels字符串中。
使用循环 (传统方式)
这是最基础的方法,易于理解,但代码稍显冗长。
public class ContainsAnyCharExample3 {
public static void main(String[] args) {
String str = "This is a test sentence.";
String vowels = "aeiou";
boolean found = false;
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
if (vowels.indexOf(c) != -1) {
found = true; // 找到了一个匹配的字符
break; // 不需要再找了,直接退出循环
}
}
System.out.println("字符串是否包含至少一个元音? " + found); // true
}
}
检查是否包含一个子字符串(字符序列)
这是 contains() 方法最经典的用法。
public class ContainsSubstringExample {
public static void main(String[] args) {
String str = "Java is a popular programming language.";
// 检查是否包含子字符串
boolean containsJava = str.contains("Java");
System.out.println("是否包含 'Java'? " + containsJava); // true
boolean containsPython = str.contains("Python");
System.out.println("是否包含 'Python'? " + containsPython); // false
// 检查时是区分大小写的
boolean containsjava = str.contains("java");
System.out.println("是否包含 'java' (小写)? " + containsjava); // false
}
}
输出:
是否包含 'Java'? true
是否包含 'Python'? false
是否包含 'java' (小写)? false
不区分大小写的检查
如果你需要进行不区分大小写的包含检查,可以将两个字符串都转换为大写或小写后再进行比较。
public class CaseInsensitiveContainsExample {
public static void main(String[] args) {
String str = "Java is a popular programming language.";
// 方法1: 使用 contains 和 toLowerCase()
boolean containsIgnoreCase1 = str.toLowerCase().contains("java");
System.out.println("不区分大小写是否包含 'java'? (方法1) " + containsIgnoreCase1); // true
// 方法2: 使用正则表达式 (?i) 标志
// (?i) 表示开启不区分大小写模式
boolean containsIgnoreCase2 = str.matches("(?i).*java.*");
System.out.println("不区分大小写是否包含 'java'? (方法2) " + containsIgnoreCase2); // true
}
}
输出:
不区分大小写是否包含 'java'? (方法1) true
不区分大小写是否包含 'java'? (方法2) true
总结与推荐
| 需求场景 | 推荐方法 | 优点 |
|---|---|---|
| 检查单个字符是否存在 | str.contains("a") |
代码最清晰,语义明确。 |
| 检查单个字符的位置 | str.indexOf('a') |
直接返回位置信息,效率高。 |
| 检查是否包含任意一个字符(来自集合) | str.matches(".*[abc].*") |
最推荐,代码简洁,性能好。 |
| 检查是否包含子字符串 | str.contains("substring") |
标准用法,简单直接。 |
| 不区分大小写的检查 | str.toLowerCase().contains("java") |
简单易懂,兼容性好。 |
希望这份详细的解释能帮助你更好地在 Java 中处理字符串包含字符的问题!
