You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中如何提取指定标识前后的目标字符串子串?

Java动态字符串的特定子串提取方案

问题场景

给定一批结构不固定的字符串,需要提取**dev.ca.{标识}.之后到.{结束标识}之前**的子串,其中:

  • 起始标识包含:ind、gb、grs、all、xfunc、epm、cif等(即dev.ca.后的第一个分段)
  • 结束标识包含:dom、raw、cdc、int等(即目标子串后的第一个分段)

示例对应关系:

原字符串提取结果
dev.ca.ind.clientaddress-completed-events.dom.0.ind-isl-clientaddress-completed.dlqclientaddress-completed-events
dev.ca.ind.insurance.client.insurance.dom.0insurance.client.insurance
dev.ca.xfunc.cxo.rawleads.dom.0cxo.rawleads
dev.ca.epm.ceapm.zab.dom.0ceapm.zab
dev.ca.ind.cx.talas.cdc.0cx.talas
dev.ca.cif.source-system-client.dom.0source-system-client
dev.ca.gb.claim.providers.int.0claim.providers

此前使用split("\\.")拆分后硬编码索引的方式,会因字符串结构变化产生bug,需要更可靠的解决方案。

解决方案:正则表达式匹配

通过正则表达式可以精准定位起始和结束标记,无需依赖固定的分段索引,核心思路:

  1. 匹配固定前缀dev.ca.后的任意起始标识(不含.),跳过其后的.
  2. 捕获从该位置到第一个.{结束标识}之前的所有内容(包括中间的.)

正则表达式定义

String regex = "dev\\.ca\\.(?:[^\\.]+)\\.(.*?)\\.(?:dom|raw|cdc|int)";

正则说明:

  • dev\\.ca\\.:匹配固定前缀,转义.避免匹配任意字符
  • (?:[^\\.]+):非捕获组,匹配任意不含.的起始标识
  • \\.:匹配起始标识后的分隔.
  • (.*?):捕获组,非贪婪匹配目标子串(避免匹配到后续的结束标识)
  • \\.(?:dom|raw|cdc|int):匹配结束标识前的.及结束标识本身(非捕获组)

Java代码示例

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class SubstringExtractor {
    public static void main(String[] args) {
        // 预编译正则表达式,提升多次匹配效率
        String regex = "dev\\.ca\\.(?:[^\\.]+)\\.(.*?)\\.(?:dom|raw|cdc|int)";
        Pattern pattern = Pattern.compile(regex);
        
        // 测试用例
        String[] testStrings = {
            "dev.ca.ind.clientaddress-completed-events.dom.0.ind-isl-clientaddress-completed.dlq",
            "dev.ca.ind.insurance.client.insurance.dom.0",
            "dev.ca.xfunc.cxo.rawleads.dom.0",
            "dev.ca.epm.ceapm.zab.dom.0",
            "dev.ca.ind.cx.talas.cdc.0",
            "dev.ca.cif.source-system-client.dom.0",
            "dev.ca.gb.claim.providers.int.0"
        };
        
        for (String str : testStrings) {
            Matcher matcher = pattern.matcher(str);
            if (matcher.find()) {
                System.out.println("原字符串:" + str);
                System.out.println("提取结果:" + matcher.group(1));
                System.out.println("---");
            } else {
                System.out.println("原字符串:" + str + " 未匹配到目标子串");
                System.out.println("---");
            }
        }
    }
}

扩展说明

如果后续需要新增起始/结束标识,只需修改正则中的对应部分即可。比如新增结束标识dlq,正则可修改为:

String regex = "dev\\.ca\\.(?:[^\\.]+)\\.(.*?)\\.(?:dom|raw|cdc|int|dlq)";

内容的提问来源于stack exchange,提问作者Aashi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 16:25:37