有没有办法在java中使用正则表达式获得所有可能的匹配:
Java Tester计划:
public class NewClass {
public static void main(String[] args) throws IOException {
String targetFileStr = IOUtils.toString(new FileInputStream(new File("src/SampleHTML.html")), "UTF-8");
Matcher matcher = Pattern.compile("<body>(.|[\\r\\n])*?<link").matcher(targetFileStr);
while (matcher.find()) {
System.out.println(matcher.group());
}
}
}
示例HTML文件,如:
<!DOCTYPE html>
<html>
<body>
<script src="1"></script>
<link href="1" />
<link href="2" />
<link href="3" />
<div>TODO write content</div>
</body>
</html>
非贪婪正则表达式当前输出:如果是非贪婪的正则表达式,则在下面给出当前程序输出 - "<body>(.|[\\r\\n])*<link"
<body>
<script src="1"></script>
<link
贪婪的正则表达式当前输出:在贪婪的正则表达式的情况下给出了程序的当前输出 - "<body>(.|[\\r\\n])*?<link"
<body>
<script src="1"></script>
<link href="1" />
<link href="2" />
<link
预期输出:但我需要从主体到链接获得所有可能的匹配
1: <body>
<script src="1"></script>
<link
2: <body>
<script src="1"></script>
<link href="1" />
<link
3: <body>
<script src="1"></script>
<link href="1" />
<link href="2" />
<link
为什么这个问题:我正在创建一个工具,可以找到并突出显示正文中的所有外部样式表。
答案 0 :(得分:2)
正确的方法是使用HTML解析器而不是正则表达式。这个答案是显示正则表达式机制,它可以帮助处理不涉及HTML或任何已经拥有其解析器的数据的类似案例。
您可以使用look-behind机制查找前面有<link
的每个<body>.*
元素,并将该“前缀”放在某个组中。不幸的是,Java中的look-behind内容必须具有最大长度。所以你可以试试像
String targetFileStr = IOUtils.toString(new FileInputStream(new File(
"input.txt")), "UTF-8");
Matcher matcher = Pattern.compile("(?<=(<body>.{0,1000}))<link",
Pattern.DOTALL).matcher(targetFileStr);
while (matcher.find()) {
System.out.println(matcher.group(1) + matcher.group());
System.out.println("---------");
}
输出:
<body>
<script src="1"></script>
<link
---------
<body>
<script src="1"></script>
<link href="1" />
<link
---------
<body>
<script src="1"></script>
<link href="1" />
<link href="2" />
<link
---------