美文网首页Java
Java 22 正则表达式

Java 22 正则表达式

作者: 第二套广播体操 | 来源:发表于2019-02-10 14:23 被阅读0次

    正则表达式:正确的规则
    专门用于对字符串的操作
    规则是由符号组成的 用符号操作字符串变得简单
    弊端:阅读性降低
    所以学习正则就是学习符号的使用
    1 匹配
    String类中提供了匹配boolean matches(String regex)方法
    2 切割
    String类中提供了匹配boolean split(String regex)方法
    3 替换
    String类中提供了匹配boolean replace(String regex)方法
    4 获取
    创建正则表达式对象进行操作java.util.regex.Pattern


    Pattern 类:
    pattern 对象是一个正则表达式的编译表示。Pattern 类没有公共构造方法。要创建一个 Pattern 对象,你必须首先调用其公共静态编译方法,它返回一个 Pattern 对象。该方法接受一个正则表达式作为它的第一个参数。
    Matcher 类:
    Matcher 对象是对输入字符串进行解释和匹配操作的引擎。与Pattern 类一样,Matcher 也没有公共构造方法。你需要调用 Pattern 对象的 matcher 方法来获得一个 Matcher 对象。

    获取方法
    Matcher方法

    PatternSyntaxException:
    PatternSyntaxException 是一个非强制异常类,它表示一个正则表达式模式中的语法错误。


    捕获组是把多个字符当一个单独单元进行处理的方法,它通过对括号内的字符分组来创建。

    例如,正则表达式 (dog) 创建了单一分组,组里包含"d","o",和"g"。

    捕获组是通过从左至右计算其开括号来编号。例如,在表达式((A)(B(C))),有四个这样的组:

    ((A)(B(C)))
    (A)
    (B(C))
    (C)
    可以通过调用 matcher 对象的 groupCount 方法来查看表达式有多少个分组。groupCount 方法返回一个 int 值,表示matcher对象当前有多个捕获组。

    还有一个特殊的组(group(0)),它总是代表整个表达式。该组不包括在 groupCount 的返回值中。


    四个String中的正则表达式功能练习

    public class Regex_Test1 {
        public static void main(String[] args) {
    //        matchesDemo(); 匹配
    //        splitDemo(); 分割
    //        replace(); 替换
    //        getDemo(); 获取
        }
    
        private static void getDemo() {
    //        实现获取将符合规则的取出来
    //        用到正则表达式对象 java.util.regex.Pattern
    //        1.将字符串规则封装成Pattern对象 compile(regex);
    //        2.通过正则对象匹配器对象,用对将正则规则 作用到要操作的字符串上
    //        3.通过匹配器对象的方法,对字符串进行操作
    
    
    //        获取字符串中符合规则的内容
            String temp="da jia zhu yi li , ming tian fang jia le";
    //        取出由三个字母组成的单词 添加边界
            String regex="\\b[a-zA-Z]{3}\\b";
    //        1.将规则编译成对象
            Pattern p=Pattern.compile(regex);
    //        2.和字符串关联,获取匹配器对象
            Matcher m=p.matcher(temp);
            while (m.find())
                System.out.println(m.group()+"字符长度位置"+m.start()+"-"+m.end());
        }
    
        private static void replace() {
            String tel="15800000011";
            String string=tel.replaceAll("(\\d{3})\\d{4}(\\d{4})","$1****$2");
    //        $可以在多参数时 ,后面的参数 可以通过变换的形式取到前一个参数的组
            System.out.println(string);
        }
    
        private static void splitDemo() {
    //        String temp="zhangsan      lisi       wangwu";
    //        String regex=" +";
    //        String temp="zhangsan.lisi.wangwu";
    //       因为java正则表达式中.为任意字符 所以要转换成普通的点
    //        String regex="\\.";
    //     两个反斜杠转义
            String temp="qwe##qweqweeeeeeeasdwezzzz1ewe";
            String regex="(.)\\1+";
    //        为了实现规则的复用,用()将需要复用的规则封装
    //        就称为了正则表达式中的组 每个组都有编号 从1开始
    //        通过使用编号就可以复用该对象组的规则内容 注意:编号必须用到组的后面 先封装 再调用
            String[] names=temp.split(regex);
            for (String name :
                    names) {
                System.out.println("+++"+name+"----");
            }
        }
    
        private static void matchesDemo() {
    //        需求 :校验手机号码是否正确
            String tel="15800000011";
            String regex="1[358][0-9]{9}";
    //        正则表达式规则
            boolean b=tel.matches(regex);
            System.out.println(tel+b);
        }
    }
    

    Test

    public class Test1 {
        public static void main(String[] args) {
            /*
            * 我我我.......我要....学学.....编程.....程
            * 还原我要学编程*/
            test_1();
        }
    
        private static void test_1() {
            String temp="我我我.......我要....学学.....编程.....程";
            /*
            * 1,四个功能选择 替换
            * 2,将..去掉
            * 3,叠词干掉*/
            temp=temp.replaceAll("\\.+","");
            temp=temp.replaceAll("(.)\\1+","$1");
            System.out.println(temp);
    
        }
    }
    
    public class Test2 {
        public static void main(String[] args) {
            //对IP地址进行排序 192.168.1.200 10.10.10.10   3.3.50.3 127.0.0.1
            test2();
        }
    
        private static void test2() {
            /*排序出现问题 是按照字符串字典顺序排的序
            * 问题在哪呢 是因为每一个地址段的位数不对
            * 如果位数都是三位就可以了 只有补0
            * 每一段位数都不同 都补两个 取后三位*/
            String temp="192.168.1.200 17.10.10.10   3.3.50.3 127.0.0.1";
    //        补两个零
            temp=temp.replaceAll("(\\d+)","00$1");
    //        取后三位
            temp=temp.replaceAll("0*(\\d{3})","$1");
            String[] strings=temp.split(" +");
            Arrays.sort(strings);
    
            for (String s :
                    strings) {
                System.out.println(s.replaceAll("0*(\\d+)","$1"));
            }
        }
    }
    
    public class Test3 {
        public static void main(String[] args) {
    //        校验邮箱地址
            test3();
        }
    
        private static void test3() {
            String temp="319501967@qq.com.cn";
           boolean b= temp.matches("\\w+@[a-zA-Z0-9]+(\\.[A-Za-z]{2,3}){1,3}");
            System.out.println(b);
        }
    //    从网上找 都有
    }
    
    //做一个邮箱爬虫
    /*1.需要一个页面
      2.需要用到IO技术  纯文本 用FileReader();
      3.需要正则表达式对象
      4.用集合装爬出来的邮箱
    
    * */
    public class Test4 {
        public static void main(String[] args) throws IOException {
            List<String> list=new ArrayList<>();
            getEmail(list);
          showEmail(list);
        }
    
        private static void getEmail(List<String> list) throws IOException {
            File file=new File("D:\\IO\\本地邮箱.txt");
            String regex="\\w+@[a-zA-Z0-9]+(\\.[A-Za-z]{2,3}){1,3}";
            Pattern p=Pattern.compile(regex);
    //        创建pattern 对象是一个正则表达式的编译表示
    
            BufferedReader reader=new BufferedReader(new FileReader(file));
            String info=null;
            while ((info=reader.readLine())!=null)
            {
               Matcher m= p.matcher(info);
    //           对获取到的一行数据 放到matcher对象中进行解释和匹配
               while (m.find())
               {list.add(m.group());}
            }
                reader.close();
        }
    
        private static void showEmail(List<String> list) {
            for (Iterator<String> iterator = list.iterator(); iterator.hasNext(); ) {
                String next = iterator.next();
                System.out.println(next);
            }
        }
    }
    

    相关文章

      网友评论

        本文标题:Java 22 正则表达式

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