zoukankan      html  css  js  c++  java
  • Java提取文本文档中的所有网址(小案例介绍正则基础知识)

    正则表达式基础以及Java中使用正则查找

    定义: 正则表达式是一些用来匹配和处理文本的字符串

    正则的基础(先大致了解下)

    1. 正则表达式的作用

    1. 查找特定的信息(搜索)

    2. 替换一些文本(替换)

    2. 正则基础知识

    1. 元字符

    • . 匹配除换行符( )以外的任何单个字符
    • w 匹配字母、数字、下划线、汉字
    • s 匹配任意空白字符(包括空格、制表符、换页符等)
    • d 匹配数字,匹配单词的开始或结束
    • ^ 匹配字符串的开始
    • $ 匹配字符串的结束

    例子:

    #匹配abc开头的字符串  
    ^abd
    
    #匹配8位数字的QQ号
    ^dddddddd$
    
    #匹配以153开头的11位数字手机号  
    ^153dddddddd$  
    

    2. 重复限定符

    • * 重复0次或更多次
    • + 重复1次或更多次
    • ? 重复0次或1次
    • {n} 重复n次
    • {n,} 重复n次或更多次
    • {n,m} 重复n到m次
    #匹配8位数字QQ号    
    ^d{8}$
    
    #匹配153开头11位手机号  
    ^(153)d{8}$
    
    #匹配身份证号第7到14位(出生日期)    
    ^d{7,14}$  
    
    #匹配以a开头的,0个或者多个以b结尾的字符串
    ^ab*$
    

    3. 分组

    #匹配字符串中包含0到多个ab开头
    ^(ab)*$
    

    4. 条件或

    正则用【|】表示或,当满足分支里任何一种条件时,就会匹配成功

    #匹配手机号中联通的手机(联通号段130/131/132等)
    ^(130|131|132)d{8}$
    

    5. 区间

    正则提供‘[]’表示区间条件

    • [0-9] 限定0到9
    • [a-z] 限定a-z
    • [165] 限定某些数字

    Java中使用正则表达式

    这里会说一个例子:在一段txt文档中找出所有的网址

    Java与正则

    1. 这里有一段100000000(自己数,我也不知道几个0)行的文本,如图

    原始文档

    2. 高手写好的匹配url的正则(https?|ftp|file)://[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]当然还有n多种方式

    3. Java代码献上

    正则表达式匹配使用方式

    /**
     * 参数1 regex:我们的正则字符串
     * 参数2 就是一大段文本,这里用data表示
     */
    private String filterSpecialStr(String regex, String data) {
        //sb存放正则匹配的结果
        StringBuffer sb = new StringBuffer();
        //编译正则字符串
        Pattern p = Pattern.compile(regex);
        //利用正则去匹配
        Matcher matcher = p.matcher(data);
        //如果找到了我们正则里要的东西
        while (matcher.find()) {
            //保存到sb中,"
    "表示找到一个放一行,就是换行
            sb.append(matcher.group() + "
    ");
        }
        return sb.toString();
    }
    

    4. 这里增加两个文件的读写

    Java读取文本文件

    private String readFile(String pathName) {
        //读取到的文件内容放到这个sb里
        StringBuffer sb = new StringBuffer();
        //The Java 7 try-with-resources syntax (Automatic Resource Management) is nice (这种写法是Java7的一种语法,自动管理资源,不理解自行百度)
        try (BufferedReader br = new BufferedReader(new FileReader(pathName))) {
            String line;
            while ((line = br.readLine()) != null) {
                sb.append(line + "
    ");
            }
            System.out.println("读取文件完成");
        } catch (IOException e) {
            e.printStackTrace();
        }
        return sb.toString();
        }
    

    Java写入文本文件

    private void writeFile(String pathName, String data) {
        try {
            //文件不存在的话新建,存在覆盖
            File file = new File(pathName);
            file.createNewFile();
            //The Java 7 try-with-resources syntax (Automatic Resource Management) is nice
            try (BufferedWriter bw = new BufferedWriter(new FileWriter(file))) {
                bw.write(data);
                bw.flush();
                System.out.println("文件写入完成");
            } catch (IOException e) {
                e.printStackTrace();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    

    5. 执行结果

    测试代码

    把文档.txt读取到Java中,然后处理完,最后写到我指定的文件中

    public static void main(String[] args) {
        //0. 准备好正则
        String regex = "(https?|ftp|file)://[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]";
        //1. 读取文档
        String data = readFile("F:\test\文档.txt");
        //2. 正则查找
        String needData = filterSpecialStr(regex, data);
        //3. 写到某个文件中
        writeFile("F:\test\needData.txt", needData);
    }
    

    结果

    过滤之后的文档

    备注:这里看到有位大神讲正则的,真好:点我去参观QAQ

  • 相关阅读:
    关于java的scanner类
    switch_case注意事项
    MySQL数据库语句总结
    注册验证
    简单的java水果商店后台
    easyui判断下拉列表
    springmvc的前端控制器
    springmvc注解驱动
    双色球
    初来乍到
  • 原文地址:https://www.cnblogs.com/baijinqiang/p/11067033.html
Copyright © 2011-2022 走看看