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

Java如何使用正则表达式提取两个指定分隔符之间的子字符串

Java 正则提取指定区间字符串的实现方案

你可以通过捕获组或者零宽断言两种正则方案实现需求,具体实现如下:

方案1:捕获组实现(兼容性更好,逻辑直观)

核心正则规则为 -a-(.*?)\\?,其中()包裹的部分就是你需要提取的目标内容,完整代码示例:

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

public class UrlExtractDemo {
    public static void main(String[] args) {
        String url = "location/city/home-a-berlin?/someNewAdress";
        // 编译正则模式
        Pattern pattern = Pattern.compile("-a-(.*?)\\?");
        Matcher matcher = pattern.matcher(url);
        if (matcher.find()) {
            // group(1) 对应第一个捕获组的内容
            String cityName = matcher.group(1);
            System.out.println(cityName); // 输出结果:berlin
        }
    }
}

规则说明:

  • -a- 精确匹配前缀标识
  • (.*?) 为非贪婪匹配,捕获前缀和后缀之间的所有内容
  • \\? 转义匹配后缀标识?(问号属于正则特殊字符,必须转义)

方案2:零宽断言实现(无需单独取捕获组)

如果不想额外处理捕获组,可以用断言直接匹配目标内容,核心正则为 (?<=-a-).*?(?=\\?),代码示例:

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

public class UrlExtractDemo {
    public static void main(String[] args) {
        String url = "location/city/home-a-berlin?/someNewAdress";
        Pattern pattern = Pattern.compile("(?<=-a-).*?(?=\\?)");
        Matcher matcher = pattern.matcher(url);
        if (matcher.find()) {
            String cityName = matcher.group();
            System.out.println(cityName); // 输出结果:berlin
        }
    }
}

规则说明:

  • (?<=-a-) 正向回顾断言,限定匹配内容的前缀必须是-a-
  • (?=\\?) 正向先行断言,限定匹配内容的后缀必须是?
  • 中间的.*?非贪婪匹配目标内容

特殊场景适配

如果输入字符串中存在多个-a-,需要和你之前用lastIndexOf效果一致,匹配最后一个-a-到?的内容,只需要把正则调整为 .*-a-(.*?)\\?即可,前缀的.*会贪婪匹配前面的所有字符,自动定位到最后一个-a-的位置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 10:00:04