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.dlq | clientaddress-completed-events |
dev.ca.ind.insurance.client.insurance.dom.0 | insurance.client.insurance |
dev.ca.xfunc.cxo.rawleads.dom.0 | cxo.rawleads |
dev.ca.epm.ceapm.zab.dom.0 | ceapm.zab |
dev.ca.ind.cx.talas.cdc.0 | cx.talas |
dev.ca.cif.source-system-client.dom.0 | source-system-client |
dev.ca.gb.claim.providers.int.0 | claim.providers |
此前使用split("\\.")拆分后硬编码索引的方式,会因字符串结构变化产生bug,需要更可靠的解决方案。
解决方案:正则表达式匹配
通过正则表达式可以精准定位起始和结束标记,无需依赖固定的分段索引,核心思路:
- 匹配固定前缀
dev.ca.后的任意起始标识(不含.),跳过其后的. - 捕获从该位置到第一个
.{结束标识}之前的所有内容(包括中间的.)
正则表达式定义
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
相关产品推荐
相关产品推荐

