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
相关产品推荐
相关产品推荐

