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

Java正则表达式:匹配双引号内所有'variant'字符串的问题

双引号内匹配所有"variant"字符串的解决方案

问题原因

你当前的正则\" .*(variant).* \"存在两个核心问题:

  1. .*是贪婪匹配,会从第一个双引号开始匹配到最后一个双引号,导致整个双引号区间被一次性捕获,捕获组仅能记录最后一个"variant";
  2. 你尝试的\" .*(variant*).* \"中,variant*是错误写法——*作用在t字符上,会匹配"varian"、"variant"、"variatt"等变体,而非固定的"variant"字符串。

可行方案

方案1:分两步匹配(逻辑更清晰)

先提取双引号内的完整内容,再在该内容中查找所有"variant":

// 匹配双引号内的所有非双引号字符
String str_regex = "\"([^\"]*)\"";
Matcher str_matcher = Pattern.compile(str_regex).matcher(joined);

while(str_matcher.find()) {
    // 获取双引号内的内容
    String quoteContent = str_matcher.group(1);
    // 在内容中查找所有"variant"
    Matcher variantMatcher = Pattern.compile("variant").matcher(quoteContent);
    while(variantMatcher.find()) {
        System.out.println(variantMatcher.group());
    }
}

方案2:单正则直接匹配

利用正向断言确保"variant"处于双引号区间内,同时使用非贪婪匹配避免跳过目标:

// 匹配双引号内的每个"variant"
String str_regex = "(?<=\")[^\"]*?(variant)(?=[^\"]*\")";
Matcher str_matcher = Pattern.compile(str_regex).matcher(joined);

while(str_matcher.find()) {
    System.out.println(str_matcher.group(1));
}

正则解释:

  • (?<=\"):正向回顾断言,确保目标前是双引号;
  • [^\"]*?:非贪婪匹配任意非双引号字符,防止跳过中间的"variant";
  • (variant):捕获目标字符串;
  • (?=[^\"]*\"):正向预查断言,确保目标后有闭合的双引号。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 02:25:52