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

Java正则如何捕获包含混合引号的目标分组内容?

解决正则匹配引号内包含异类型引号的问题

你的问题出在正则没有区分包裹字符串的引号类型,导致匹配到字符串内部的异类型引号时就提前终止了。比如第一个例子里,你用双引号包裹内容,但正则里的[\"']会匹配到内容里的单引号,直接截断了匹配结果。

修正后的正则思路

我们需要先捕获包裹内容的引号(单引号或双引号),然后匹配直到相同类型的结束引号,同时允许内容里包含另一种类型的引号:

String regex = "\\$.test\\(([\"'])(.*?)\\1\\)";

让我拆解一下这个正则的关键部分:

  • \\$.test\\(:匹配开头的$.test((注意转义括号)
  • ([\"']):捕获第一个引号(单或双),作为分组1
  • (.*?):非贪婪匹配引号内的所有内容,直到遇到和分组1相同的引号
  • \\1:反向引用分组1的引号,确保匹配的是和开头相同类型的结束引号
  • \\):匹配结尾的括号

代码示例

// 第一个测试用例
String content1 = "$.test(\"I am do'in testing\") ";
Matcher matcher1 = Pattern.compile("\\$.test\\(([\"'])(.*?)\\1\\)").matcher(content1);
if (matcher1.find()) {
    System.out.println("捕获到的内容:" + matcher1.group(2)); // 输出:I am do'in testing
}

// 第二个测试用例
String content2 = "$.test('I am do\"in testing')";
Matcher matcher2 = Pattern.compile("\\$.test\\(([\"'])(.*?)\\1\\)").matcher(content2);
if (matcher2.find()) {
    System.out.println("捕获到的内容:" + matcher2.group(2)); // 输出:I am do"in testing
}

补充说明

如果你的场景中还存在同类型转义引号(比如"I am do\"in testing"),那上面的正则还需要调整,要忽略转义的引号。这种情况下可以用更复杂的正则:

String regexWithEscape = "\\$.test\\(([\"'])(.*?)(?<!\\\\)\\1\\)";

这里的(?<!\\\\)是负向零宽断言,确保结束引号没有被反斜杠转义,这样就能正确处理转义的同类型引号了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:14:47