本文目录导读:

我来详细介绍Java字符串匹配的几种常见开发案例:
基础字符串匹配方法
public class StringMatchExample {
public static void main(String[] args) {
String text = "Hello World, Welcome to Java Programming";
String pattern = "Java";
// 1. contains() - 是否包含
System.out.println("Contains 'Java': " + text.contains("Java"));
// 2. indexOf() - 查找首次出现位置
int index = text.indexOf("World");
System.out.println("Index of 'World': " + index);
// 3. lastIndexOf() - 查找最后出现位置
int lastIndex = text.lastIndexOf("o");
System.out.println("Last index of 'o': " + lastIndex);
// 4. startsWith() / endsWith()
System.out.println("Starts with 'Hello': " + text.startsWith("Hello"));
System.out.println("Ends with 'Programming': " + text.endsWith("Programming"));
// 5. 使用matches()进行正则匹配
boolean isMatch = text.matches(".*Java.*");
System.out.println("Matches pattern '.*Java.*': " + isMatch);
}
}
正则表达式匹配
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexMatchExample {
public static void main(String[] args) {
String text = "我的邮箱是user@example.com,电话是138-1234-5678";
// 1. 匹配邮箱
String emailPattern = "\\w+@\\w+\\.\\w+";
Pattern pattern = Pattern.compile(emailPattern);
Matcher matcher = pattern.matcher(text);
if (matcher.find()) {
System.out.println("找到邮箱: " + matcher.group());
}
// 2. 匹配电话号码
String phonePattern = "\\d{3}-\\d{4}-\\d{4}";
Pattern phonePatternCompiled = Pattern.compile(phonePattern);
Matcher phoneMatcher = phonePatternCompiled.matcher(text);
if (phoneMatcher.find()) {
System.out.println("找到电话: " + phoneMatcher.group());
}
// 3. 多模式匹配
String multiPattern = "(邮箱|电话|地址)";
Pattern multiPatternCompiled = Pattern.compile(multiPattern);
Matcher multiMatcher = multiPatternCompiled.matcher(text);
while (multiMatcher.find()) {
System.out.println("匹配到关键词: " + multiMatcher.group() +
" 位置: " + multiMatcher.start());
}
}
}
KMP算法实现
public class KMPAlgorithm {
// 构建部分匹配表
private static int[] buildPMT(String pattern) {
int[] pmt = new int[pattern.length()];
int j = 0;
for (int i = 1; i < pattern.length(); i++) {
while (j > 0 && pattern.charAt(i) != pattern.charAt(j)) {
j = pmt[j - 1];
}
if (pattern.charAt(i) == pattern.charAt(j)) {
j++;
}
pmt[i] = j;
}
return pmt;
}
// KMP搜索
public static int kmpSearch(String text, String pattern) {
if (pattern.isEmpty()) return 0;
int[] pmt = buildPMT(pattern);
int j = 0;
for (int i = 0; i < text.length(); i++) {
while (j > 0 && text.charAt(i) != pattern.charAt(j)) {
j = pmt[j - 1];
}
if (text.charAt(i) == pattern.charAt(j)) {
j++;
}
if (j == pattern.length()) {
return i - j + 1; // 返回匹配起始位置
}
}
return -1; // 未找到
}
public static void main(String[] args) {
String text = "ABCABCABD";
String pattern = "ABCABD";
int index = kmpSearch(text, pattern);
if (index != -1) {
System.out.println("找到模式 '" + pattern + "' 在文本中的位置: " + index);
System.out.println("匹配子串: '" + text.substring(index, index + pattern.length()) + "'");
} else {
System.out.println("未找到模式 '" + pattern + "'");
}
}
}
实用字符串匹配工具类
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class StringMatchUtils {
// 查找所有匹配位置
public static List<Integer> findAllMatches(String text, String pattern) {
List<Integer> positions = new ArrayList<>();
Pattern p = Pattern.compile(Pattern.quote(pattern));
Matcher m = p.matcher(text);
while (m.find()) {
positions.add(m.start());
}
return positions;
}
// 模糊匹配(忽略大小写)
public static boolean fuzzyMatch(String text, String pattern) {
return text.toLowerCase().contains(pattern.toLowerCase());
}
// 通配符匹配 (* 和 ?)
public static boolean wildcardMatch(String text, String pattern) {
String regex = pattern
.replace(".", "\\.")
.replace("*", ".*")
.replace("?", ".");
return text.matches(regex);
}
// 提取匹配内容
public static List<String> extractMatches(String text, String regex) {
List<String> matches = new ArrayList<>();
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(text);
while (matcher.find()) {
matches.add(matcher.group());
}
return matches;
}
// 测试
public static void main(String[] args) {
String text = "Hello Java, hello Python, Hello JavaScript";
// 查找所有"hello"位置(忽略大小写)
List<Integer> positions = findAllMatches(text.toLowerCase(), "hello");
System.out.println("'hello'的所有位置: " + positions);
// 模糊搜索
System.out.println("包含'java': " + fuzzyMatch(text, "java"));
// 通配符匹配
System.out.println("通配符匹配 'H*llo': " + wildcardMatch(text, "H*llo"));
// 提取单词
List<String> words = extractMatches(text, "\\w+");
System.out.println("提取的单词: " + words);
}
}
性能测试与比较
public class PerformanceTest {
public static void main(String[] args) {
// 准备测试数据
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 100000; i++) {
sb.append("test" + i + " ");
}
String text = sb.toString();
String pattern = "test99999";
// 测试不同方法
long startTime, endTime;
// 1. contains()
startTime = System.nanoTime();
boolean result1 = text.contains(pattern);
endTime = System.nanoTime();
System.out.println("contains() 耗时: " + (endTime - startTime) + " ns");
// 2. indexOf()
startTime = System.nanoTime();
int index = text.indexOf(pattern);
endTime = System.nanoTime();
System.out.println("indexOf() 耗时: " + (endTime - startTime) + " ns");
// 3. matches()
startTime = System.nanoTime();
boolean result3 = text.matches(".*" + Pattern.quote(pattern) + ".*");
endTime = System.nanoTime();
System.out.println("matches() 耗时: " + (endTime - startTime) + " ns");
// 4. 使用Pattern
startTime = System.nanoTime();
Pattern p = Pattern.compile(Pattern.quote(pattern));
Matcher m = p.matcher(text);
boolean result4 = m.find();
endTime = System.nanoTime();
System.out.println("Pattern.find() 耗时: " + (endTime - startTime) + " ns");
}
}
最佳实践建议
- 简单匹配:优先使用
contains(),indexOf()等基础方法 - 复杂模式:使用正则表达式,但注意预编译Pattern对象提升性能
- 大量数据:考虑使用KMP等高效算法
- 错误处理:添加null检查和异常处理
- 国际化:注意字符编码和Unicode支持
这些案例涵盖了Java字符串匹配的常用场景和实现方法,你可以根据实际需求选择合适的方案。
版权声明:足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播