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
相关产品推荐
相关产品推荐

