Java正则表达式分支匹配场景下复用同一捕获组的实现问题
Java正则多分支匹配结果合并至同一分组的实现方案
Java确实不支持PCRE的分支重置语法(?|),可以通过以下两种通用方式实现需求:
方案1:全版本兼容的逻辑适配方案
不需要修改你现有的正则,匹配完成后直接取两个分组中不为空的结果即可,实现成本最低:
原正则保留:-([^\s"]+)|-"(.+?)"
代码示例:
import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexDemo { public static void main(String[] args) { Pattern pattern = Pattern.compile("-([^\\s\"]+)|-\"(.+?)\""); // 测试用例 String[] inputs = new String[]{"-hello", "-\"Hello World\""}; for (String input : inputs) { Matcher matcher = pattern.matcher(input); if (matcher.find()) { // 优先取group1,为空则取group2,两个分组必然有一个匹配成功 String res = matcher.group(1) != null ? matcher.group(1) : matcher.group(2); System.out.println(res); } } } }
运行输出为:
hello Hello World
方案2:Java 9+ 同命名捕获组方案
如果你使用Java 9及以上版本,可以给两个分支的捕获组设置相同的命名,匹配后直接通过组名取值:
正则写法:-(?:(?<param>[^\s"]+)|"(?<param>.+?)")
代码示例:
Pattern pattern = Pattern.compile("-(?:(?<param>[^\\s\"]+)|\"(?<param>.+?)\")"); Matcher matcher = pattern.matcher(input); if (matcher.find()) { String res = matcher.group("param"); }
内容的提问来源于stack exchange,提问作者Joel
相关产品推荐
相关产品推荐

