刚刚遇到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()总是返回零,即使有两个匹配,如上例所示。
谢谢,非常感谢您的帮助。
答案 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> "
}