• Java正则表达式


    一、为什么要学习正则表达式

    1、为了解决上述问题。Java提供了正则表达式技术,专门来处理类似于文本问题

    2、简单来说:正则表达式是对字符串进行模式匹配的技术

    3、正则表达式:regular expression => regexp

    二、正则表达式语法

    1、元字符-转义号 \\

    在我们使用正则表达式去检索某些特殊字符的时候,需要用到转义符号,否则检索不到结果,甚至会报错

    例如 用$去匹配 "abc$"

    需要用到转义符号的字符有以下: + () $ / \ ? [ ] ^ {}

    2、元字符-字符匹配符

    image

    image

    1)[a-z]说明:表示可以匹配a-z中的任意一个字符

    //String regStr = "[a-z]";      //匹配a-z之间的任意一个字符
    //String regStr = "[A-Z]";      //匹配[A-Z]之间的任意一个字符

    2)java正则表达式是默认区分大小写的,如何实现不区分大小写

    String regStr = "abc";          //匹配abc字符串【默认区分大小写】
    // String regStr = "(?i)abc";          //匹配abc字符串【不区分大小写】
    
    //1、当创建Pattern对象是,指定Pattern.CASE_INSENSITIVE,表示匹配不区分字母大小写
    Pattern pattern = Pattern.compile(regStr,Pattern.CASE_INSENSITIVE);

    3)[^a-z]表示匹配不是a-z的所有字符

    4)[abcd] 表示可以匹配abcd中的任意一个字符

    5)[^abcd]表示匹配不是abcd中的任意一个字符

    6)\\d表示可以匹配0-9中的任意一个数字,相当一[0-9]

    7)\\D表示可以匹配不是0-9中的任意一个数字,相当于[^0-9]

    8)\\w匹配任意英文字符,数字和下划线,相当于[a-zA-Z0-9_]

    9)\\W相当于[^a-zA-Z0-9_]

    10)\\s表示匹配任何空白字符串(空格,制表符等)

    11)\\S匹配任何非空白字符

    12) . 匹配\n之外的所有字符,如果需要匹配,如果需要匹配 . 本身,则需要使用 \\.

    public class RegexpTest3 {
        public static void main(String[] args) {
            String content = "aabcbzABCF8hGgh";
            //String regStr = "[a-z]";      //匹配a-z之间的任意一个字符
            //String regStr = "[A-Z]";      //匹配[A-Z]之间的任意一个字符
            //String regStr = "abc";          //匹配abc字符串【默认区分大小写】
            // String regStr = "(?i)abc";          //匹配abc字符串【不区分大小写】
            String regStr = "[^a-z]";      //匹配不是a-z之间的任意一个字符
            //1、当创建Pattern对象是,指定Pattern.CASE_INSENSITIVE,表示匹配不区分字母大小写
            Pattern pattern = Pattern.compile(regStr);
            Matcher matcher = pattern.matcher(content);
            while (matcher.find()){
                System.out.println("找到:"+matcher.group(0));
            }
    
        }
    }

    3、选择匹配符

    在匹配某个字符串的时候是选择性的,即:即可以匹配这个,也可以匹配哪个,这是需要用到选择

    匹配符号 |

    image

    public class RegexpTest4 {
        public static void main(String[] args) {
            String content = "aabcbzABCF寒 函 han8hGgh";
            String regStr = "函|han|寒";      //匹配不是a-z之间的任意一个字符
            Pattern pattern = Pattern.compile(regStr);
            Matcher matcher = pattern.matcher(content);
            while (matcher.find()){
                System.out.println("找到:"+matcher.group(0));
            }
        }
    }

    4、正则限定符

    用于指定其前面的字符和组合项,连续出现多少次

    image
    image
     
    public class RegexpTest5 {
        public static void main(String[] args) {
            String content = "aaaaaafafag342gggg";
            //String regStr = "a{3}";   //匹配aaa
            //String regStr = "\\d{2}"; //匹配两位连续的数字
    
            //匹配aa | aaa | aaaa (java匹配时默认是贪婪匹配,也就是尽可能匹配多的 aaaa)
            //String regStr = "a{2,4}";
    
            //String regStr = "\\d{2,4}";  //表示匹配2位连续的数字 | 3位连续的数字 |  4位连续的数字
    
            //String regStr = "1+";  //吊事匹配1个1或者多个1
    
            //String regStr = "1?";  //表示匹配 1 | 11
    
            String regStr = "1*";  //匹配1个1 或者 多个1
    
            Pattern pattern = Pattern.compile(regStr);
            Matcher matcher = pattern.matcher(content);
            while (matcher.find()){
                System.out.println("找到:"+matcher.group(0));
            }
        }
    }

    5、正则定位符

    规定要匹配的字符串出现的位置,比如在字符串的开始还是在结束的位置,这个定位符是非常有用的,

    必须掌握

    image

    ^ 和 $ 使用最多

    public class RegexpTest6 {
        public static void main(String[] args) {
            String content = "han fadsjfdafhan";
            //String regStr = "^[0-9]+[a-z]*";  //匹配以数字开头且后面跟0或者多个字符的字符串
            //String regStr = "^[0-9]+[a-z]+$*";  //匹配以数字开头且后面跟一个小写字母结束
    
            //表示匹配边界的han [这里的边界指的是:被匹配的字符串的最后或者空格的字符串的后面 -》han fadsjfdafhan】
            String regStr = "han\\b";  //匹配以数字开头且后面跟一个小写字母结束
            Pattern pattern = Pattern.compile(regStr);
            Matcher matcher = pattern.matcher(content);
            while (matcher.find()){
                System.out.println("找到:"+matcher.group(0));
            }
        }
    }

    6、分组

    image
    public class RegexpTest7 {
        public static void main(String[] args) {
            String content = "han fadsjfdafhan af444 nn38948949";
            //匹配四个数字的字符串
            /*
                下面就是非命名分组
                说明:
                    1、matcher.group(0) 得到匹配的字符串
                    2、matcher.group(1) 得到匹配字符串的第一个分组
                    3、matcher.group(2) 得到匹配字符串的第二个分组
             */
    
           // String regStr = "(\\d\\d)(\\d\\d)";
    
            //命令分组,即可以给分组取名
            String regStr = "(?<g1>\\d\\d)(?<g2>\\d\\d)";
    
            Pattern pattern = Pattern.compile(regStr);
            Matcher matcher = pattern.matcher(content);
            while (matcher.find()){
                System.out.println("找到:"+matcher.group(0));
               /* System.out.println("找到第一个分组的内容:"+matcher.group(1));
                System.out.println("找到第二个分组的内容:"+matcher.group(2));*/
    
                System.out.println("找到第一个分组的内容:"+matcher.group("g1"));
                System.out.println("找到第二个分组的内容:"+matcher.group("g2"));
            }
        }
    }
    image

    7、特别分组

    image

    特别分组实例演示

    public class RegexpTest8 {
        public static void main(String[] args) {
            String content = "hello韩顺平教育 jack韩顺平老师 韩顺平同学";
    
            //1、找到韩顺平教育 | 韩顺平老师 | 韩顺平同学 子字符串
            //String regStr = "韩顺平教育|韩顺平老师|韩顺平同学";
            //上面的写法可以等价与非捕获分组
            String regStr = "韩顺平(?:教育|老师|同学)"; //括号中的内容不能通过matcher.group(1)捕获的
    
            Pattern pattern = Pattern.compile(regStr);
            Matcher matcher = pattern.matcher(content);
            while (matcher.find()){
                System.out.println("找到:"+matcher.group(0));
            }
        }
    }
    image
    
    
    public class RegexpTest8 {
        public static void main(String[] args) {
            String content = "hello韩顺平教育 jack韩顺平老师 韩顺平同学";
    
            //2、找到韩顺平这个关键字,但是要求只是查找韩顺平教育和韩顺平开始中包含的韩顺平
            String regStr = "韩顺平(?=教育|老师)";
    
            Pattern pattern = Pattern.compile(regStr);
            Matcher matcher = pattern.matcher(content);
            while (matcher.find()){
                System.out.println("找到:"+matcher.group(0));
            }
        }
    }
    image
    image

    8、? 非贪婪匹配

    当字符紧跟随其他任何限定符(* + ? {n} {n,} {n,m})之后时,匹配模式是非贪心的。非贪心的模式匹配搜索到的是尽可能短的字符串;

    而默认的贪心的匹配搜索模式匹配搜索到的是尽可能长的字符串。

    例如在字符串 "oooo"中,”o+"匹配所有“o" 而”o+?"匹配一个“o"

  • 相关阅读:
    MyBatis高级查询 存储过程
    MyBatis高级查询 一对多映射
    第20章-使用JMX管理Spring Bean
    第19章-使用Spring发送Email
    第18章-使用WebSocket和STOMP实现消息功能
    第17章-Spring消息
    第16章-使用Spring MVC创建REST API
    第15章-使用远程服务
    基于IKAnalyzer搭建分词服务
    第08章-使用Spring Web Flow
  • 原文地址:https://www.cnblogs.com/houchen/p/15728942.html
Copyright © 2020-2023  润新知