Java中提取两指定标记间文本最常用方式是substring+indexOf组合或正则表达式:前者轻量易读,适用于固定、非嵌套标记;后者灵活强大,支持多匹配、转义及非贪婪捕获,但需防范嵌套、未闭合等边界问题。

Java 中提取两个指定标记之间的文本,最常用且可靠的方式是用正则表达式或字符串的 substring + indexOf 组合。关键在于处理边界情况:标记可能不存在、嵌套、重复,或目标内容为空。
用 substring 和 indexOf 定位(适合简单、确定结构)
当左右标记固定、不嵌套、只出现一次时,这种方法轻量、易读、无正则开销。
- 先用
indexOf(left)找左标记起始位置,加上左标记长度得到内容起点 - 再从该起点开始,用
indexOf(right, start)找右标记位置 - 用
substring(start, end)截取,注意判空和 -1 检查
示例:
public static String extractBetween(String text, String left, String right) {
if (text == null || left == null || right == null) return null;
int start = text.indexOf(left);
if (start == -1) return null;
start += left.length();
int end = text.indexOf(right, start);
if (end == -1) return null;
return text.substring(start, end);
}
用正则表达式(适合灵活匹配、支持多次提取)
正则更强大,尤其适合提取多个匹配、忽略大小写、或标记含特殊字符(需转义)。
立即学习“Java免费学习笔记(深入)”;
- 基本模式:
Pattern.compile(Pattern.quote(left) + "(.*?)" + Pattern.quote(right)) -
Pattern.quote()确保左右标记中的正则元字符(如[、.、*)被正确转义 -
.*?是非贪婪匹配,避免跨段捕获;用group(1)取括号内内容
示例(提取所有匹配):
List<String> results = new ArrayList<>();
Pattern pattern = Pattern.compile(Pattern.quote("[") + "(.*?)" + Pattern.quote("]"));
Matcher matcher = pattern.matcher(text);
while (matcher.find()) {
results.add(matcher.group(1));
}
处理常见陷阱
实际使用中容易出错的地方:
-
标记重叠或嵌套:比如文本是
"a[ b [ c ] d ]",简单正则会匹配到" b [ c ";此时需手写状态机或用栈解析 -
标记未闭合:右标记缺失时,
substring版本返回null,正则版不匹配,都算合理行为 -
区分大小写:若需忽略大小写,正则加
Pattern.CASE_INSENSITIVE;indexOf版本需先统一转小写再查(注意影响原始内容) -
空内容:如
"abc[]def",应返回空字符串""而非null,按业务需求决定是否允许
第三方库辅助(如 Apache Commons Lang)
如果项目已引入 commons-lang3,可用 StringUtils.substringBetween() 快速实现:
// 返回第一个匹配,或 null(不抛异常) String result = StringUtils.substringBetween(text, "[", "]"); // 提取全部 String[] all = StringUtils.substringsBetween(text, "[", "]");
它内部做了空值检查和基础边界处理,适合快速开发,但不支持正则逻辑或复杂定制。


















