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>
# 1 楼答案
你不用正则表达式来操作html
相反,解析html,例如使用jsoup,并正确删除元素
# 2 楼答案
您可以使用非贪婪
?
来实现这一点:默认情况下
*
将匹配它得到的所有内容,从<code>
的第一次出现到</code>
的最后一次。使用问号?
时,它将在第一次出现时停止匹配尽管我强烈建议不要用正则表达式“解析”任何结构,但最好使用专用的HTML解析器