我试图检测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>
。
答案 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解析器