有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java正则表达式检测<code></代码>代码块

我试图检测HTML源代码文件中的<code>...</code>块,以便从文件中删除它们。 我正在使用Java8模式和Matcher类来实现正则表达式。例如,此方法打印出每个<code>...</code>查找

protected void printSourceCodeChunks() {
  // Design a regular expression to detect code chunks
  String patternString = "<code>.*<\\/code>";
  Pattern pattern = Pattern.compile(patternString);
  Matcher matcher = pattern.matcher(source);
  
  // Loop over findings
  int i = 1;
  while (matcher.find())
    System.out.println(i++ + ": " + matcher.group());
}

典型的输出是:

1: <code> </code>
2: <code></code>
3: <code>System.out.println("Hello World");</code>

由于我使用的是特殊字符,并且源代码块可能包含换行符(\n或\r),因此不会检测到包含换行符的代码块。幸运的是,Pattern类可以被指示将换行符包含在dot的含义中,只需添加

  Pattern pattern = Pattern.compile(patternString, Pattern.DOTALL);

这种方法的问题是只检测到一个(假)<code>...</code>块:从HTML文件中第一次出现的<code>和最后一次出现的</code>开始的块。现在,输出包括这两个标记之间的所有HTML代码

如何修改正则表达式以匹配每个代码块

解决方案

正如你们中的许多人所发布的,为了未来读者的利益,这就像通过

<code>.*?<\\/code>

as*将所有字符都带到它找到的最后一个</code>


共 (2) 个答案

  1. # 1 楼答案

    你不用正则表达式来操作html

    相反,解析html,例如使用jsoup,并正确删除元素

    String html = "<html><head><title>First parse</title></head>"
            + "<body><p>Parsed HTML into a doc.</p><code>foo</code><code></code><code> </code></body></html>";
    Document doc = Jsoup.parse(html);
    Elements codes = doc.body().getElementsByTag("code");
    codes.remove();
    System.out.println(doc.toString());
    
  2. # 2 楼答案

    您可以使用非贪婪?来实现这一点:

    String patternString = "<code>.*?<\\/code>"
    

    默认情况下*将匹配它得到的所有内容,从<code>的第一次出现到</code>的最后一次。使用问号?时,它将在第一次出现时停止匹配

    尽管我强烈建议不要用正则表达式“解析”任何结构,但最好使用专用的HTML解析器