zoukankan      html  css  js  c++  java
  • 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"

  • 相关阅读:
    JavaScript cookie详解
    Javascript数组的排序:sort()方法和reverse()方法
    javascript中write( ) 和 writeln( )的区别
    div做表格
    JS 盒模型 scrollLeft, scrollWidth, clientWidth, offsetWidth 详解
    Job for phpfpm.service failed because the control process exited with error code. See "systemctl status phpfpm.service" and "journalctl xe" for details.
    orm查询存在价格为空问题
    利用救援模式破解系统密码
    SSH服务拒绝了密码
    C# 调用 C++ DLL 中的委托,引发“对XXX::Invoke类型的已垃圾回收委托进行了回调”错误的解决办法
  • 原文地址:https://www.cnblogs.com/houchen/p/15728942.html
Copyright © 2011-2022 走看看