Java正则正向预查提取求助:匹配指定内容后提取逗号分隔列表
解决Java正则中的正向预查与列表提取问题
嘿,作为刚接触正则的Java开发者,我完全懂你遇到这些问题的头疼!咱们一步步来拆解解决:
一、为什么SKIP在Java里不生效?
首先得明确:Java自带的java.util.regex引擎不支持PCRE中的SKIP、FAIL这类特性,这些是Perl兼容正则的专属语法,所以你之前看到的方案在Java里跑不通很正常,得换Java支持的思路来实现需求。
二、提取"summer time we"后的逗号分隔列表
针对你的实际场景:给定字符串
It is very nice in summer and in summer time we swim, run, tan
要提取[swim, run, tan]这个数组,这里有两种实用的Java正则方案:
方案1:先匹配完整列表再拆分
先通过正向预查定位到"summer time we "之后的内容,拿到完整的逗号分隔字符串,再用split()拆分数组:
import java.util.Arrays; import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexDemo { public static void main(String[] args) { String input = "It is very nice in summer and in summer time we swim, run, tan"; // 正则:匹配"summer time we "之后的所有单词(含逗号分隔符) Pattern pattern = Pattern.compile("(?<=summer time we )(?:\\w+(?:, )?)*"); Matcher matcher = pattern.matcher(input); if (matcher.find()) { String listStr = matcher.group(); String[] result = listStr.split(", "); System.out.println(Arrays.toString(result)); // 输出 [swim, run, tan] } } }
方案2:逐个捕获目标单词
用正向预查同时匹配"summer time we "之后的第一个单词,以及后续逗号后的每个单词,通过循环find()收集所有结果:
import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexDemo { public static void main(String[] args) { String input = "It is very nice in summer and in summer time we swim, run, tan"; // 正则:匹配"summer time we "或", "之后的单词 Pattern pattern = Pattern.compile("(?<=summer time we |, )(\\w+)"); Matcher matcher = pattern.matcher(input); List<String> resultList = new ArrayList<>(); while (matcher.find()) { resultList.add(matcher.group(1)); } System.out.println(resultList); // 输出 [swim, run, tan] } }
这两种方案都避开了Java不支持的SKIP特性,完全用Java正则引擎兼容的语法实现了需求,你可以根据自己的场景选择更合适的一种~
内容的提问来源于stack exchange,提问作者Krishna
相关产品推荐
相关产品推荐

