在某度知道上看到这样一个题:
从控制台读取包含 HTML 的文件的名称。
示例:Info about Leela <span xml:lang="en"><b><span>Leela Turanga</span></b></span><span>Super</span><span>girl</span>
main 方法的第一个参数是标记名。例如,“span”。显示与指定标记匹配的所有标记。顺序应与文件中的顺序一致,每个标记位于一个新行上。空格的数量、换行符 (\n) 或回车 (\r) 都不会影响结果。文件没有 CDATA 标记。每个开始标记都有一个单独的结束标记,没有自结束标记。标记可以包含嵌套标记。
示例输出:<span xml:lang="en"><b><span>Leela Turanga</span></b></span><span>Leela Turanga</span><span>Super</span><span>girl</span>
标记模板:<tag>text1</tag><tag text2>text1</tag><tag
text2>text1</tag>
text1 和 text2 可以为空
解决示例图:
代码:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.InputStreamReader;
import java.net.URLDecoder;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Solution {
public static void main(String[] args) {
try {
//文件路径+文件名
String filePath = "C:\\Users\\sghd-9191\\Desktop\\test.txt";
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//读取控制台输入的字符
String tag = br.readLine();
//关闭输入流
br.close();
//读取文件,然后查找标签并输出
findAndPrintfTag(tag, readHtmlFile(filePath));
} catch (Throwable e) {
e.printStackTrace();
}
}
/***查找标记**/
private static void findAndPrintfTag(String tag, String fileStr) {
try {
StringBuilder regEx = new StringBuilder();
regEx.append("(<").append(tag).append(".*?").append("</").append(tag).append(">)");
// 编译正则表达式
Pattern pattern = Pattern.compile(regEx.toString(), Pattern.DOTALL);
// 忽略大小写的写法
Matcher matcher = pattern.matcher(fileStr);
// 查找字符串中是否有匹配正则表达式的字符/字符串
while (matcher.find()) {
System.out.println(matcher.group(1));
}
} catch (Throwable e) {
// TODO: handle exception
e.printStackTrace();
}
}
/***读取文件**/
private static String readHtmlFile(String filePath) {
int len;
char[] buf = new char[1024];
StringBuilder sb = new StringBuilder();
try {
FileReader fileReader = new FileReader(URLDecoder.decode(filePath, "utf-8"));
while ((len = fileReader.read(buf)) != -1) {
sb.append(String.valueOf(buf, 0, len));
}
//关闭文件流
fileReader.close();
} catch (Throwable e) {
e.printStackTrace();
}
return sb.toString();
}
}