如何用中间的引号捕获这个组?

时间:2018-05-24 18:01:45

标签: java regex

    String content = "$.test(\"I am do'in testing\") ";
    Matcher matcher = 
     Pattern.compile("\\$.test.*?(.*?[\"'](.*?)[\"'].*?)").matcher(content);

输出为("I am do',但我需要捕获I am do'in testing。不确定我在这里失踪了吗?

同样输入可以是" $ .test(\'我做"在测试中')"输出应为I am do'in testing

1 个答案:

答案 0 :(得分:1)

\$.test.*?(.*?["'](.*?)["'].*?)

这是你的正则表达式。此正则表达式使用["']和另一个["']之间的延迟量词。当您的输入为"

时,这会使'(双引号)和$.test("I am do'in testing")单引号匹配

因此,它匹配并捕获捕获组#1中的I am do

另一个问题是你没有在$之后转义点,这可能导致匹配任何字符而不是文字点。

您可以使用此正则表达式来匹配使用反斜杠跳过转义的单引号或双引号之间的字符串:

\$\.test[^'"]*(?:"([^"\\]*(?:\\.[^"\\]*)*)"|'((?:[^'\\]*(?:\\.[^'\\]*)*))').*

RegEx Demo

<强>代码:

final String regex = "\\$\\.test[^'\"]*(?:\"([^\"\\\\]*(?:\\\\.[^\"\\\\]*)*)\"|'((?:[^'\\\\]*(?:\\\\.[^'\\\\]*)*))').*";

final Pattern pattern = Pattern.compile(regex);
final Matcher matcher = pattern.matcher( input );

while (matcher.find()) {
    System.out.printf("Group-1: %s, Group-2: %s%n", matcher.group(1), matcher.group(2));
}