如何找到所有可能的正则表达式匹配

时间:2013-11-24 07:37:37

标签: java regex

有没有办法在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

为什么这个问题:我正在创建一个工具,可以找到并突出显示正文中的所有外部样式表。

1 个答案:

答案 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
---------