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

正则表达式匹配带引号字符串时末尾引号未被去除问题求助

解决正则匹配时引号未正确去除的问题

我来帮你搞定这个正则匹配的小坑!你遇到的情况是贪婪匹配在搞鬼,咱们一步步拆解问题、修复它:

问题根源

你原来的正则表达式 #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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:14:58