我正在尝试检测 <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/