Java正则表达式:匹配双引号内所有'variant'字符串的问题
双引号内匹配所有"variant"字符串的解决方案
问题原因
你当前的正则\" .*(variant).* \"存在两个核心问题:
.*是贪婪匹配,会从第一个双引号开始匹配到最后一个双引号,导致整个双引号区间被一次性捕获,捕获组仅能记录最后一个"variant";- 你尝试的
\" .*(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
相关产品推荐
相关产品推荐

