Java正则表达式问题 - 不能匹配同一行中的两个字符串

时间:2015-01-19 23:20:57

标签: java regex

刚刚遇到Java正则表达式的一些问题 我有一个程序可以读取HTML文件并替换@ VR @字符内的任何字符串,即@ VR @ Test1 2 3 4 @ VR @

但是我的问题是,如果该行包含两个以上被@ VR @包围的字符串,则它与它们不匹配。它会使最左边的@ VR @与句子中最右边的@ VR @相匹配,从而获取它们之间的任何内容。

例如:

<a href="@VR@URL-GOES-HERE@VR@" target="_blank" style="color:#f4f3f1; text-decoration:none;" title="ContactUs">@VR@Google@VR@</a>    

我的代码匹配

URL-GOES-HERE@VR@" target="_blank" style="color:#f4f3f1; text-decoration:none;" title="ContactUs">@VR@Google

这是我的Java代码。如果你能帮助我解决这个问题,我将不胜感激:

Pattern p = Pattern.compile("@VR@.*@VR@");
Matcher m;
Scanner scanner = new Scanner(htmlContent);

while (scanner.hasNextLine()) {
      String line = scanner.nextLine();
      m = p.matcher(line);

      StringBuffer sb = new StringBuffer();

      while (m.find()) {
           String match_found = m.group().replaceAll("@VR@", "");
           System.out.println("group: " + match_found);
      }
}

我尝试用m.group(0)和m.group(1)替换m.group(),但没有。此外,m.groupCount()总是返回零,即使有两个匹配,如上例所示。

谢谢,非常感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

你的问题是.*是“贪婪的”;它会尝试匹配尽可能长的子字符串,同时仍然让整个表达式匹配。因此,例如,在@VR@ 1 @VR@ 2 @VR@ 3 @VR@中,它将匹配1 @VR@ 2 @VR@ 3

最简单的解决方法是将其设置为“非贪婪”(尽可能少地匹配,同时让表达式匹配),方法是将*更改为*?

Pattern p = Pattern.compile("@VR@.*?@VR@");
  

同样,m.groupCount()总是返回零,即使有两个匹配,如上例所示。

这是因为m.groupCount()返回基础模式中捕获组的数量(带括号的子表达式,其对应的匹配子串使用m.group(1)m.group(2)等检索)。在您的情况下,您的模式没有捕获组,因此m.groupCount()返回0。

答案 1 :(得分:0)

您可以尝试使用正则表达式:

@VR@(((?!@VR@).)+)@VR@

演示:

private static final Pattern REGEX_PATTERN = 
        Pattern.compile("@VR@(((?!@VR@).)+)@VR@");

public static void main(String[] args) {
    String input = "<a href=\"@VR@URL-GOES-HERE@VR@\" target=\"_blank\" style=\"color:#f4f3f1; text-decoration:none;\" title=\"ContactUs\">@VR@Google@VR@</a> ";

    System.out.println(
        REGEX_PATTERN.matcher(input).replaceAll("$1")
    );  // prints "<a href="URL-GOES-HERE" target="_blank" style="color:#f4f3f1; text-decoration:none;" title="ContactUs">Google</a> "
}