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

时间:2019-01-31 12:14:46

标签: java regex

我试图检测HTML源代码文件中的<code>...</code>块,以便从文件中删除它们。 我正在使用Java 8 Pattern和Matcher类来实现RegEx。例如,此方法将打印出每个<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>

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

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

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

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

解决方案

正如你们中许多人发布的那样,为了将来的读者受益,这就像更改我的正则表达式一样简单

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

由于*会将所有字符带到找到的最后一个</code>

2 个答案:

答案 0 :(得分:4)

您不使用正则表达式来操作html!

例如,使用jsoup解析html,然后正确删除元素。

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());

答案 1 :(得分:2)

您可以使用非贪婪 ?来做到这一点:

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

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

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

相关问题