2019-04-10

作者: DreamPath | 来源:发表于2019-04-18 18:49 被阅读0次

    正则表达式:

    • 1.专门用于操作字符串的技术
    • 2.而且可以简化代码,用于对字符串进行复杂操作
    • 3.通过一些符号的形式,简化了代码的书写,其实底层还是代码
    • 弊端:符号太多,阅读性差

    正则对字符串的常见功能操作

    • 1.匹配
    • 2.切割
    • 3.替换
    • 4.获取
    package rejexMatches;
    
    import java.util.Scanner;
    
    /**
     *   1.1中括号: [判断字符位上的内容]
     *    1.2预定义字符: 都带有反斜线
     *   .  : 任意字符
     *   \d : 数字.  [0-9]
     *   \D :非数字  [^0-9]
     *   \w : 单词字符 [a-z A-Z _0-9]
     * 1.3边界字符
     *   ^ :行开头
     *   $ :行结尾
     *   \b : 单词边界
     * 1.4: 数量词:必须结合内容
     *   x? : x内容出现零次或一次
     *   x* : x内容出现零次或多次
     *   x+ : x内容出现一次或多次
     *   x{n} :x内容出现n次
     *   x{n,} : x内容至少出现n次
     *   x{n,m} : x内容出现n到m次
     */
    public class Matches_demo {
    
        public static void main(String[] args) {
    
            Scanner scan=new Scanner(System.in);
    
    while (true) {
        System.out.println("请输入您的QQ号:");
        String str = scan.nextLine();
        boolean b = str.matches("\\.+");
        if (b) {
            System.out.println(str+": 输入的QQ号合法");
            break;
        }else
        System.out.println(str + ": 输入的QQ号不和法,请重新输入");
    }
        }
    }
    

    后三种操作

    package split_demo;
    
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    
    public class SplitDemoString {
        public static void main(String[] args) {
            String str = "huiehf....sud###suidh..frdgggg.gt.fdd.kkkuhgu..yfdgdtf";
            /*
            1.匹配(略)
             */
            /*
            2.切割
             */
            splitss(str);
    
            /*
            3.替换
             */
            replaceString(str);
    
            /*
            4.获取
             */
            /**
             * Pattern对象的使用原理
             * 1.将正则表达式字符串编译成正则对象
             * 2.通过Pattern对象获取Matcher对象(匹配器对象)
             * 3.通过匹配器对象对字符串进行规划的匹配,结果都在匹配器当中
             * 4.通过匹配器对象的功能获取结果.
             */
            gets(str);
        }
    
        private static void gets(String str) {
            String sts = "di.shu.hi hd.hdd,iu ,gfu";
            String regex = "\\b[a-zA-Z]{3}\\b";
    
            //获取正则表达式对象
            Pattern pt = Pattern.compile(regex);
            //通过正则表达式对象获取适配器
            Matcher ms = pt.matcher(sts);
    
            //貌似像一个迭代器   这里是一个匹配器,如果找到匹配的就输出,不能找到就继续找下一个,直到结束索引退出循环
            while (ms.find()) {
                System.out.println(ms.start() + "----" + ms.group() + "----" + ms.end());
                System.out.println(sts.substring(ms.start(), ms.end()));
            }
    
        }
    
        private static void replaceString(String str) {
            // String replace = str.replaceAll("(.)\\1+","&&");
    
            //在参数列表中,其他参数使用之前的参数中规则的组,需要使用&组编号
            //将多个重叠的字符浓缩为一个字符
    //       String replace = str.replaceAll("(.)\\1+","$1");
    
            //电话号码的隐藏,为了保证公布信息的正确性但是又维护个人信息的私密性,也就是防止被人打骚扰电话.
         /*   String ss="18569146418";
           String replace = ss.replaceAll("(\\d{3})\\d{4}(\\d{4})","$1****$2");
                 System.out.println(replace);
    */
            String ssy = "aiuuf99900nsnudh8978789ynsudhy089897sd";
            //邮件网站过滤  只要出现5个以上的数字直接干掉为***  为了刻意去公布  使用了中国文字,将无法过滤信息
            ssy = ssy.replaceAll("\\d{5,}", "***");//比如:  衣二三四巴九零齐齐
    
            System.out.println(ssy);
        }
    
        private static void splitss(String str) {
    
           /* String[] strings = str.split("\\.+");
            for (String ss:strings) {
                System.out.println(ss);
            }*/
    
        /*    正则规则的复用,想复用,先封装,正则封装用()完成
            封装完成后有编号,从1开始,规则中被()封装的称之为组,直接通过编号就可以调用对应的组
            调用方式直接写已有的组的编号加上\\
            如  :  ()\\1.在使用已有的第一组内容,原则:先有组,才可以使用对应的编号调用组.*/
    
            String[] strings = str.split("(.)\\1+");
            for (String ss : strings) {
                System.out.println(ss);
            }
        }
    }
    

    案例二
    "23.11.10.5 192.168.1.103 3.3.3.3 10.10.10.10"

    要求:将这些ip地址进行排序

    package example_1;
    
    import java.util.Arrays;
    
    /**
     * 思路:
     * 1.将ip通过空格切割
     * 2.对ip进行排序Arrays.sort(),通过字符串字典顺序进行排序,这个顺序,这个顺序是错误的
     * 原因: 每个ip有四块,每一段最多有三位,每一位不超过255
     * 应该按照位数来比较才对
     * 因此我们需要将非三位的数字转换成三位.
     * <p>
     * 措施:将每个字段都添加两个0,再取后面三位,比较后,打印时再去掉前面的零.
     */
    public class Ip_demo {
        public static void main(String[] args) {
            String str = "23.11.10.5     192.168.1.103    3.3.3.3  10.10.10.10";
            //首先需要在每个字段前面添上两个零
            str = str.replaceAll("(\\d+)", "00$1");
    
            //获取最后每个字段后三位
            str = str.replaceAll("0*(\\d{3})", "$1");
            //使用.进行切割成字符串数组
            String[] ips = str.split(" +");
            //将每个字符串进行升序排列
            Arrays.sort(ips);
            //循环遍历,并在遍历的同时将每个字段前面的零去掉
            for (String ss : ips) {
                System.out.println(ss.replaceAll("0*(\\d+)", "$1"));
            }
        }
    }
    

    案例三:邮件校验功能
    使用正则中的匹配功能

    package example_1;
    
    
    public class ItCast_mail {
        public static void main(String[] args) {
            /**
             * 邮件校驗
             * 使用正则表达式中的匹配
             */
            String mail = "itcast@2019itcast.cn";
    
            String mails = "422399419@qq.com";
    
            //比较笼统的校验规则
            String regex = "\\w+@\\w+(\\.\\w+)+";
    
            //稍微完整的校验规则
            String regex1 = "[a-zA-Z_0-9]+@[a-zA-Z_0-9]+(\\.[a-zA-Z_0-9]{2,3}){1,3}";
            boolean b = mail.matches(regex);
            boolean b1 = mails.matches(regex1);
    
            System.out.println(mail + "---------" + b);
            System.out.println(mails + "---------" + b1);
    
        }
    }
    

    基于本地网页文件邮箱地址获取

    package java_WangYePaChong;
    
    import java.io.*;
    import java.util.HashSet;
    import java.util.Set;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class JiYuFile {
        public static void main(String[] args) throws IOException {
            //创建文件源头
            File file = new File("D:\\Java代码\\Java进阶1\\regular01\\src\\java_WangYePaChong\\temple\\hello.html");
            //创建正则表达式源头
            String regex = "\\w+@\\w+(\\.\\w+)+";
            //返回邮箱地址集合  可存储到数据库中
            Set<String> set = fileInMail(file, regex);
    
            //循环遍历 后期可以存储到数据库中
            for (String ss : set) {
                System.out.println(ss);
            }
    
        }
    
        //基于文件源爬起取
        private static Set<String> fileInMail(File file, String regex) throws IOException {
    
            //创建存储邮箱地址的集合对象
            Set<String> set = new HashSet<>();
            //创建正则表达式对象,并将规则传入
            Pattern p = Pattern.compile(regex);
    
    
            //获取字符读取流对象
            BufferedReader buf = new BufferedReader(new FileReader(file));
            String line;
            //循环读取操作
            while ((line = buf.readLine()) != null) {
                //使用正则对象创建匹配器对象
                Matcher m = p.matcher(line);
                //如果找到符合regex的,便将符合的字符串存入到集合中
                while (m.find()) {
                    set.add(m.group());
                }
    
            }
            //返回集合
            return set;
        }
    }
    

    获取外网的html中的邮箱地址

    package java_WangYePaChong;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.net.URLConnection;
    import java.sql.Connection;
    import java.util.HashSet;
    import java.util.Set;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class UrlWangYeHtml {
        public static void main(String[] args) throws IOException {
    
            String str_url = "http://www.downxia.com/zixun/48009.html";
    
            String regex = "\\w+@\\w+(\\.\\w+)+";
    
            //创建url对象
            URL url = new URL(str_url);
    
            //创建基于网页爬虫方法
            Set<String> set = getMail(url, regex);
    
            for (String ss : set) {
                System.out.println(ss);
            }
        }
    
        private static Set<String> getMail(URL url, String regex) throws IOException {
    
            URLConnection con = url.openConnection();
            Pattern p = Pattern.compile(regex);
            Set<String> set = new HashSet<>();
            BufferedReader buf = new BufferedReader(new InputStreamReader(con.getInputStream()));
    
            String line;
            //循环读取操作
            while ((line = buf.readLine()) != null) {
                //使用正则对象创建匹配器对象
                Matcher m = p.matcher(line);
                //如果找到符合regex的,便将符合的字符串存入到集合中
                while (m.find()) {
                    set.add(m.group());
                }
    
            }
            buf.close();
            return set;
    
        }
    }
    

    相关文章

      网友评论

        本文标题:2019-04-10

        本文链接:https://www.haomeiwen.com/subject/rkuoiqtx.html