正则表达式匹配带引号字符串时末尾引号未被去除问题求助
解决正则匹配时引号未正确去除的问题
我来帮你搞定这个正则匹配的小坑!你遇到的情况是贪婪匹配在搞鬼,咱们一步步拆解问题、修复它:
问题根源
你原来的正则表达式 #TEST_ENV_(.*)=\"?(.*)\"? 里,第二个 .* 是贪婪匹配模式——它会尽可能多地抓取字符,包括末尾的双引号。因为最后的 \"? 是可选规则,正则引擎会优先让 .* 吃掉更多内容,导致末尾的引号没被 \"? 匹配到,反而被包含进了 group(2),所以你得到了 value"。
修复方案
这里有两种靠谱的解决方式,你可以按需选择:
方案1:用精确字符限制优化正则
把第二个 .* 替换成匹配非引号字符的表达式,从根源上避免引号被误捕获:
String str = "#TEST_ENV_TEST_VAR=\"value\""; // 正则解释:[^\"]* 仅匹配非双引号字符,$ 锚定字符串结尾确保匹配完整性 Pattern p = Pattern.compile("#TEST_ENV_(.*?)=\"?([^\"]*)\"?$"); Matcher matcher = p.matcher(str); if (matcher.find()) { String key = matcher.group(2); System.out.println(key); // 输出:value }
哪怕是不带引号的字符串(比如 #TEST_ENV_TEST_VAR=value),这个正则也能正确捕获到 value。
方案2:先捕获完整值,再统一处理引号
这种方式更直观,先把等号后的内容完整捕获,再通过简单替换去掉首尾引号:
String str = "#TEST_ENV_TEST_VAR=\"value\""; Pattern p = Pattern.compile("#TEST_ENV_(.*?)=(.*)"); Matcher matcher = p.matcher(str); if (matcher.find()) { String rawValue = matcher.group(2); // 去除首尾的双引号(仅当存在时) String key = rawValue.replaceAll("^\"|\"$", ""); System.out.println(key); // 输出:value }
这个方法兼容性更强,哪怕值只有单边引号(虽然这种场景很少见),也能处理成你想要的结果。
内容的提问来源于stack exchange,提问作者Parth Patel
相关产品推荐
相关产品推荐

