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

标签 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() 始终返回零,即使在我上面的示例中有两个匹配项也是如此。

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

最佳答案

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

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

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

Also m.groupCount() always returns zero, even if there are two matches as in my example above.

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

关于Java 正则表达式问题 - 无法匹配同一行中的两个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28035232/

相关文章:

JAVA 使用一维数组和方法打印用户要求的正确数量的等级时出现问题

java - 正则表达式匹配循环永远不会终止

java - 如何创建一个接受可变数量参数的 Java 方法?

java - 无法使用restFB 在我的墙上发帖

java - 如何在没有缓冲的情况下从 Java 中的另一个应用程序读取 STDOUT

java - 使用正则表达式匹配多行日志文件中的每条消息

mysql - 替换在 mysql 和 mariadb 中不起作用的正则表达式

java - 如何在 Java 中编写这个正则表达式(单词后跟数字)?

javascript - 如何使用正则表达式匹配 document.doctype.internalSubset 中的所有元素

java - 无法获得与 PostgreSQL 的 JDBC 连接