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

标签 java regex

我正在尝试检测 <code>...</code> HTML 源代码文件中的 block ,以便将它们从文件中删除。 我正在使用 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>

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

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

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

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

解决方案建议

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

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

as * 获取直到最后一个的所有字符 </code>它找到了。

最佳答案

你不使用正则表达式来操作 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());

关于java - 正则表达式检测 <code>...</code> 代码块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54460374/

相关文章:

javascript - MAC 地址正则表达式验证逗号分隔、冒号或破折号分隔值

python - 使用正则表达式删除字符串中最后一个数字之后的所有文本

java - 从文件读取时的 String.contains()

java - 不能在 2 个数组列表上使用 equal

c# - 拆分具有多个拆分字符串的文本文件

javascript - 在每 "n"个字符添加空格后,如果第一个字符为零则不计数

php - 是否可以从 preg_match 中捕获任何错误并显示常见错误消息?

java - 如何检查 Java 2d 数组 Tic Tac Toe 中的垂直和对角获胜

java - 想要在整个应用程序中保存用户对角色的选择

Java、端口、套接字、通过程序管道连接