首页 > 其他分享 >正则表达式

正则表达式

时间:2024-11-16 13:40:11浏览次数:1  
标签:false 正则表达式 System matches println true out

正则表达式: regular expression, 很多时候都简写为 regex.

正则表达式可以校验字符串是否满足一定的规则, 并用来校验数据格式的合法性.

Java 中, 正则表达式是以字符串的形式体现的.

程序示例:

public class RegexDemo1 {
    public static void main(String[] args) {
        /*
         * 假如现在要求校验一个 qq 号码是否正确. 
         * 规则: 6 位及 20 位之内, 日不能在开头, 必须全部是数字. 
         * 先使用目前所学知识完成校验需求然后体验一下正则表达式检验. 
         */

        String qq = "1234567890";
        System.out.println(checkQQ(qq));

        System.out.println(qq.matches("[1-9]\\d{5,19}"));
        // 其他用途举例:
        // 校验用户名是否满足规则
        // 校验密码是否满足规则
        // 校验身份证是否满足规则
        // 校验手机是否满足规则
    }

    public static boolean checkQQ(String qq) {
        // 规则: 6 位及 20 位之内, 日不能在开头, 必须全部是数字 . 
        // 核心思想:
        // 先把异常数据进行过滤
        // 下面的就是满足要求的数据了. 
        int len = qq.length();
        if (len < 6 || len > 20) {
            return false;
        }
        // 0 不能在开头
        if (qq.startsWith("0")) {
            return false;
        }
        // 必须全部是数字
        for (int i = 0; i < qq.length(); i++) {
            char c = qq.charAt(i);
            if (c < '0' | c > '9') {
                return false;
            }
        }
        return true;
    }
}

正则表达式的作用

  • 作用一: 校验字符串是否满足规则

  • 作用二: 在一段文本中查找满足要求的内容

正则表达式中, 方括号表示范围.

正则表达式的匹配是从左到右一个一个地去匹配的.

[abc] 表示字符串只能出现 abc, 且只能出现一个.

^ 表示取反.


图1

程序示例:

public class Demo2 {
    public static void main(String[] args) {
        System.out.println("ab".matches("[abc]"));  // false
        String s = "abca";
        System.out.println(s.matches("[abc]"));  // false
        String ss = "abc";
        System.out.println(ss.matches("[abc]"));  // false
        String sss = "a";
        System.out.println(sss.matches("[abc]"));  // true
        System.out.println("ab".matches("[abc][abc]"));         // true
        System.out.println("zz".matches("[^abc]"));             // false
        System.out.println("zz".matches("[^abc][^abc]"));       // true
        // 只能一个一个地匹配
        System.out.println("a".matches("[ad]"));  // true, 匹配 a 或者 d
        System.out.println("b".matches("[a-dp-z]"));  // true, 匹配 a ~ d 或者 p ~ z
    }
}

程序示例:

public class RegexDemo2 {
    public static void main(String[] args) {
        // public boolean Matches(String regex) : 判断是否与正则表达式匹配, 匹配返回 true
        // 只能是 a b c
        System.out.println("-----------1-------------");
        System.out.println("a".matches("[abc]")); // true
        System.out.println("z".matches("[abc]")); // false

        // 不能出现 a b c
        System.out.println("-----------2-------------");
        System.out.println("a".matches("[^abc]")); // false
        System.out.println("z".matches("[^abc]")); // true
        System.out.println("zz".matches("[^abc]")); // false
        System.out.println("zz".matches("[^abc][^abc]")); // true

        // a 到 zA 到 Z (包括头尾的范围)
        System.out.println("-----------3-------------");
        System.out.println("a".matches("[a-zA-z]")); // true
        System.out.println("z".matches("[a-zA-z]")); // true
        System.out.println("aa".matches("[a-zA-z]"));// false
        System.out.println("zz".matches("[a-zA-Z]")); // false
        System.out.println("zz".matches("[a-zA-Z][a-zA-Z]")); // true
        System.out.println("0".matches("[a-zA-Z]"));// false
        System.out.println("0".matches("[a-zA-Z0-9]"));// true

        // [a-d[m-p]] a 到 d, 或 m 到 p
        System.out.println("-----------4-------------");
        System.out.println("a".matches("[a-d[m-p]]"));// true
        System.out.println("d".matches("[a-d[m-p]]")); // true
        System.out.println("m".matches("[a-d[m-p]]")); // true
        System.out.println("p".matches("[a-d[m-p]]")); // true
        System.out.println("e".matches("[a-d[m-p]]")); // false
        System.out.println("0".matches("[a-d[m-p]]")); // false

        // [a-z&&[def]] a-z 和 def 的交集. 为: d, e, f
        // 细节: 如果要求两个范围的交集, 那么需要写符号 &&
        // 如果写成了一个 &, 那么此时 & 表示就不是交集了, 而是一个简简单单的 & 符号
        System.out.println("----------5------------");
        System.out.println("a".matches("[a-z&[def]]")); // true
        System.out.println("&".matches("[a-z&[def]]")); // true
        System.out.println("&".matches("[a-z&&[def]]")); // false
        System.out.println("a".matches("[a-z&&[def]]")); // false
        System.out.println("d".matches("[a-z&&[def]]")); // true
        System.out.println("0".matches("[a-z&&[def]]")); // false

        // [a-z&&[^bc]] a-z 和 非 bc 的交集. (等同于 [ad-z])
        System.out.println("-----------6------------_");
        System.out.println("a".matches("[a-z&&[^bc]]"));// true
        System.out.println("b".matches("[a-z&&[^bc]]")); // false
        System.out.println("0".matches("[a-z&&[^bc]]")); // false

        // [a-z&&[^m-p]] a 到 z 和除了 m 到 p 的交集. (等同于 [a-1q-z])
        System.out.println("-----------7-------------");
        System.out.println("a".matches("[a-z&&[^m-p]]")); // true
        System.out.println("m".matches("[a-z&&[^m-p]]")); // false
        System.out.println("0".matches("[a-z&&[^m-p]]")); // false
    }
}

图2

图3

程序示例:

public class RegexDemo3 {
    public static void main(String[] args) {
        // \ 转义字符 改变后面那个字符原本的含义
        // 练习: 以字符串的形式打印一个双引号
        // " 在 Java 中表示字符串的开头或者结尾

        // 此时 \ 表示转义字符, 改变了后面那个双引号原本的含义
        // 把他变成了一个普普通通的双引号而已. 
        System.out.println("\"");

        // \ 表示转义字符
        // 两个 \ 的理解方式: 前面的 \ 是一个转义字符, 改变了后面 \ 原本的含义, 把他变成一个普普通通的 \ 而已. 
        System.out.println("c:Users\\moon\\IdeaProjects\\basic-code\\myapi\\src\\com\\itheima\\a08regexdemo\\RegexDemo1.java");

        // . 表示任意一个字符
        System.out.println("----------------------- 1 ----------------------");
        System.out.println("你".matches("..")); // false
        System.out.println("你".matches(".")); // true
        System.out.println("你a".matches(".."));// true

        // \\d 表示任意的一个数字
        // \\d 只能是任意的一位数字
        // 简单来记: 两个 \ 表示一个 \
        System.out.println("----------------------- 2 ----------------------");
        System.out.println("a".matches("\\d")); // false
        System.out.println("3".matches("\\d")); // true
        System.out.println("333".matches("\\d")); // false
        System.out.println("333".matches("\\d\\d\\d")); // true

        // \\w只能是一位单词字符[a-zA-Z_0-9]
        System.out.println("----------------------- 3 ----------------------");
        System.out.println("z".matches("\\w")); // true
        System.out.println("2".matches("\\w")); // true
        System.out.println("21".matches("\\w")); // false
        System.out.println("你".matches("\\w"));// false

        // 非单词字符
        System.out.println("你".matches("\\W")); // true

        // 以上正则匹配只能校验单个字符. 

        // 必须是数字 字母 下划线 至少 6位
        System.out.println("----------------------- 4 ----------------------");
        System.out.println("2442fsfsf".matches("\\w{6,}"));// true
        System.out.println("244f".matches("\\w{6,}"));// false

        // 必须是数字和字符 必须是4位
        System.out.println("----------------------- 5 ----------------------");
        System.out.println("23dF".matches("[a-zA-Z0-9]{4}"));// true
        System.out.println("23 F".matches("[a-zA-Z0-9]{4}"));// false
        System.out.println("23dF".matches("[\\w&&[^_]]{4}"));// true
        System.out.println("23_F".matches("[\\w&&[^_]]{4}"));// false
    }
}

在 API 帮助文档中搜索 Pattern 可以找到这些规则.

图片名称

或者先找 String 类, 再找 matches 方法.

图片名称
练习: 

请使用正则表达式完成如下需求

-   请编写正则表达式验证用户输入的手机号码是否满足要求. 
    
-   请编写正则表达式验证用户输入的邮箱号是否满足要求. 
    
-   请编写正则表达式验证用户输入的电话号码是否满足要求. 

实际工作中, 很少自己从零开始写正则表达式, 一般都是在搜索引擎中查到一个类似的, 再修改为自己需要的.

IDEA 插件: any-rule

图片名称

右键可以进入插件, 查找自己需要的格式.

图片名称

 

图片名称

插件自动生成的正则表达式, 需要再进行修改, 比如, ^ 表示从开头进行匹配, $ 表示一直匹配到末尾, 而 matches() 方法默认就是从头到尾进行匹配的, 所以这两个符号要删除. 再比如, 要给 \ 改为 \\.

程序示例:

public class RegexDemo4 {
    public static void main(String[] args) {
        /*
         * 需求
         * 请编写正则表达式验证用户输入的手机号码是否满足要求. 请编写正则表达式验证用户输入的邮箱号是否满足要求. 请编写正则表达式验证用户输入的电话号码是否满足要求. 
         * 验证手机号码 13112345678 13712345667 13945679027 139456790271
         * 验证座机电话号码 020-2324242 02122442 027-42424 0712-3242434
         * 验证邮箱号码 [email protected] [email protected] [email protected]
         * [email protected]
         */

        // 心得:
        // 拿着一个正确的数据, 从左到右依次去写. 
        // 例如, 13112345678
        // 分成三部分:
        // 第一部分: 1 表示手机号码只能以 1 开头, 第一个位置, 写 1 或者 [1], 方括号没必要写了, 直接删掉即可
        // 第二部分: [3-9] 表示手机号码第二位只能是 3-9 之间的
        // 第三部分: \\d{9} 表示任意数字可以出现 9 次, 也只能出现 9 次
        System.out.println("--------------- 验证手机号码 ---------------");
        String regex1 = "1[3-9]\\d{9}";
        System.out.println("13112345678".matches(regex1)); // true
        System.out.println("13712345667".matches(regex1)); // true
        System.out.println("13945679027".matches(regex1)); // true
        System.out.println("139456790271".matches(regex1)); // false

        // 座机电话号码
        // 020-2324242 02122442 027-42424 0712-3242434
        // 思路:
        // 在书写座机号正则的时候需要把正确的数据分为三部分
        // 一: 区号 0\\d{2,3}
        // 0: 区号一定是以 0 开头的
        // \\d{2,3}: 表示区号从第二位开始可以是任意的数字, 可以出现 2 到 3 次. 
        // 二: - ? 表示次数, 0 次或一次
        // 三: 号码 号码的第一位也不能以 0 开头, 从第二位开始可以是任意的数字, 号码的总长度: 5-10 位
        System.out.println("--------------- 验证座机电话号码 ---------------");
        String regex2 = "0\\d{2,3}-?[1-9]\\d{4,9}";
        System.out.println("020-2324242".matches(regex2));
        System.out.println("02122442".matches(regex2));
        System.out.println("027-42424".matches(regex2));
        System.out.println("0712-3242434".matches(regex2));

        // 邮箱号码
        // [email protected] [email protected] [email protected] [email protected]
        // 思路:
        // 在书写邮箱号码正则的时候需要把正确的数据分为三部分
        // 第一部分: @ 的左边 \\w+
        // 任意的字母数字下划线, 至少出现一次就可以了
        // 第二部分: @ 只能出现一次
        // 第三部分: 还要分成三小段来看, 分别是 . 的前面, . 和 . 的后面三个部分
        // 3.1 .的左边 [\\w&&[^_]]{2,6}
        // 任意的字母加数字, 总共出现 2-6 次 (此时不能出现下划线)
        // 3.2 . \\. 单独的一个 . 表示匹配任意的字符, 必须转义这个 .
        // 3.3 大写字母, 小写字母都可以, 只能出现2-3次[a-zA-Z]{2,3}
        // 我们可以把 3.2 和 3.3 看成一组, 这一组可以出现 1 次或者两次
        System.out.println("--------------- 验证邮箱号码 ---------------");
        String regex3 = "\\w+@[\\w&&[^_]]{2,6}(\\.[a-zA-Z]{2,3}){1,2}";
        System.out.println("[email protected]".matches(regex3));
        System.out.println("[email protected]".matches(regex3));
        System.out.println("[email protected]".matches(regex3));
        System.out.println("[email protected]".matches(regex3));

        // 24小时的正则表达式
        System.out.println("--------------- 24小时 ---------------");
        String regex4 = "([01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d";
        System.out.println("23:11:11".matches(regex4));
        // 23:11:11
        // 表示小时的部分:
        // 01 02 03 ... 09
        // 10 11 12 ... 19
        // 20 21 22 23
        // | 前面的正则表达式匹配前两种情况, 后面的正则表达式匹配最后一种情况

        // 分钟和秒钟的格式一样, 可以括起来当成一组, 再重复两次
        String regex5 = "([01]\\d|2[0-3])(:[0-5]\\d){2}";
        System.out.println("23:11:11".matches(regex5));
    }
}

"([01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d" 中的 ([01]\\d|2[0-3]) 中的 | 表示或者, | 前面的正则表达式或者后面的正则表达式, 只需要满足一个就行.

将需要作为 | 两侧部分的内容用小括号括起来.

"a((?i)b)c" : 只忽略 b 的大小写, a 和 c 完全一样.

程序示例:

public class RegexDemo5 {
    public static void main(String[] args) {
        /*
         * 正则表达式练习:
         * 需求
         * 请编写正则表达式验证用户名是否满足要求. 要求:大小写字母, 数字, 下划线一共4-16位请编写正则表达式验证身份证号码是否满足要求. 
         * 简单要求:18位, 前17位任意数字, 最后一位可以是数字可以是大写或小写的x复杂要求:按照身份证号码的格式严格要求. 
         *
         * 身份证号码:
         * 41080119930228457x
         * 510801197609022309
         * 15040119810705387X
         * 130133197204039024 I
         * 430102197606046442
         */

        // 用户名要求:大小写字母, 数字, 下划线一共4-16位
        String regex1 = "\\w{4,16}";
        System.out.println("zhangsan".matches(regex1));
        System.out.println("lisi".matches(regex1));
        System.out.println("wangwu".matches(regex1));
        System.out.println("$123".matches(regex1));

        System.out.println("------------------------------");

        // 身份证号码的简单校验:
        // 18位, 前17位任意数字, 最后一位可以是数字可以是大写或小写的x
        // 身份证号第一位不能是 0
        String regex2 = "[1-9]\\d{16}(\\d|x|x)";
        String regex3 = "[1-9]\\d{16}[\\dXx]"; // 放在方括号里面也可以表示或者, 此时不要再加上 |
        // 忽略 x 的大小写
        String regex5 = "[1-9]\\d{16}(\\d(?i)x)";

        System.out.println("41080119930228457x".matches(regex3));
        System.out.println("510801197609022309".matches(regex3));
        System.out.println("15040119810705387X".matches(regex3));
        System.out.println("130133197204039024".matches(regex3));
        System.out.println("430102197606046442".matches(regex3));

        // 忽略大小写的书写方式
        // 在匹配的时候忽略abc的大小写
        String regex4 = "a((?i)b)c";
        System.out.println("------------------------------");
        System.out.println("abc".matches(regex4));// true
        System.out.println("ABC".matches(regex4));// false
        System.out.println("aBc".matches(regex4));// true

        // 身份证号码的严格校验
        // 编写正则的小心得:
        // 第一步:按照正确的数据进行拆分
        // 第二步:找每一部分的规律, 并编写正则表达式
        // 第三步:把每一部分的正则拼接在一起, 就是最终的结果
        // 书写的时候:从左到右去书写. 

        // 410801 1993 02 28 457x
        // 前面6位:省份, 市区, 派出所等信息, 第一位不能是0, 后面5位是任意数字 [1-9]\\d{5}
        // 年的前半段: 18 19 20 (18|19|20)
        // 年的后半段: 任意数字出现两次 \\d{2}
        // 月份: 01~ 09 10 11 12 (0[1-9]|1[0-2])
        // 日期: 01~09 10~19 20~29 30 31 (0[1-9]|[12]\\d|3[01]) 日期分三种情况
        // 后面四位: 任意数字出现3次 最后一位可以是数字也可以是大写x或者小写x \\d{3}[\\dXx]
        String regex6 = "[1-9]\\d{5}(18|19|20)\\d{2}(@[1-9]|1[0-2])(@[1-9]|[12]\\d|3[01])\\d{3}[\\dxXx]";

        System.out.println("------------------------------");

        System.out.println("41080119930228457x".matches(regex6));
        System.out.println("510801197609022309".matches(regex6));
        System.out.println("15040119810705387X".matches(regex6));
        System.out.println("130133197204039024".matches(regex6));
        System.out.println("430102197606046442".matches(regex6));

    }
}
图片名称 图片名称

() 表示分组, a(bc) 表示 bc 作为整体出现.

标签:false,正则表达式,System,matches,println,true,out
From: https://www.cnblogs.com/Chengkai730/p/18549306

相关文章

  • 如何使用正则表达式验证域名
    下面是一篇关于如何使用正则表达式验证域名的教程。如何使用正则表达式验证域名简介域名是互联网上网站的地址,每个域名由多个标签(label)组成,标签之间用点.分隔。域名规则有很多细节,但基本要求是:每个标签只能包含字母、数字和短横线-。标签的长度不能超过63个字符。......
  • Python中的正则表达式教程
    一、正则表达式基础1。1。概念介绍正则表达式是用于处理字符串的强大工具,它并不是Python的一部分。其他编程语言中也有正则表达式的概念,区别只在于不同的编程语言实现支持的语法数量不同。它拥有自己独特的语法以及一个独立的处理引擎,在提供了正则表达式的语言里,正则表......
  • 特殊符号和正则表达式
    特殊符号#的作用1.在一些配置文件中表示注释2.在前导符中表示root用户登录当前系统$的作用1.获取变量内容echo$PAHTecho$LANG!的作用1.强制执行|的作用1.管道符,命令拼接;的作用1.命令分隔符,不管前面的命令是否执行成功,都会去执行后面的命令,个数不限制ls......
  • shell正则表达式、sed基本用法及sed应用案例
    一、正则表达式●可以使用若干符号配合某工具对字符串进行增删改查操作1.1基本正则列表正则符号描述^匹配行首$匹配行尾[]集合,匹配集合中任意单个字符[^]对集合取反.匹配任意字符*匹配前一个字符任意次数【*不允许单独使用】\{n,m}匹配......
  • Python爬虫知识体系-----正则表达式-----持续更新
    数据科学、数据分析、人工智能必备知识汇总-----Python爬虫-----持续更新:https://blog.csdn.net/grd_java/article/details/140574349文章目录一、正则基础1.为什么使用正则2.正则与re模块简介二、正则表达式1.匹配单个字符与数字2.限定符3.定位符4.选择匹配符5.......
  • 正则表达式re模块
    importre#正则表达式中的元字符:#“.”点通配符表示可以替换表达式中的任意字符,只能代指一个字符,除换行符外print(re.findall("a..","hdhgaqwe"))#“^”只从开始匹配print(re.findall("^a..","ahdhgaqwe"))#“$”只从结尾匹配print(re.findall("a..$","ahdh......
  • LeetCode【0010】正则表达式匹配
    本文目录1中文题目2求解思路2.1基础解法:递归法2.2优化解法:动态规划和递归结合2.3最优解法:NFA(非确定性有限自动机)3题目总结1中文题目给一个字符串s和一个字符规律p,实现一个支持‘.’和‘*’的正则表达式匹配。‘.’匹配任意单个字符‘*’匹配零个或......
  • Shell系列(2)正则表达式、awk与sed用法
    一、正则表达式正则表达式(RegularExpression,简称regex或regexp)是一种强大的文本处理工具,用于搜索、替换、检索或校验符合特定模式的文本。正则表达式由一系列字符组成,这些字符可以是普通字符(如字母、数字等)或特殊字符(称为元字符),它们定义了搜索模式。1、基本正则与扩展正......
  • JS之正则表达式
    一、什么是正则表达式<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>Document<......
  • JS正则表达式
    一、概念正则表达式(规则表达式)用于定义一些字符串的规则,计算机可以根据正则表达式,来检查一个字符串是否符合规则,将字符串中符合规则的内容提取出来二、创建正则方式一:构造函数创建var变量=newRegExp("正则表达式","匹配模式");参数一:规则参数二:i忽略大小写g全局匹......