Buffere读取控制台和文件并匹配

在某度知道上看到这样一个题:

从控制台读取包含 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();
    }

}

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值