Java 基础进阶篇(十八):正则表达式匹配规则和应用

这篇具有很好参考价值的文章主要介绍了Java 基础进阶篇(十八):正则表达式匹配规则和应用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


一、正则表达式概述

  正则表达式是对字符串(包括普通字符(例如:a 到 z 之间的字母)和特殊字符(称为“元字符”))操作的一种逻辑公式,就是用事先定义好的一些特定字符及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。正则表达式是一种文本模式,该模式描述在搜索文本时要匹配的一个或多个字符串。

简而言之,正则表达式可以用一些规定的字符来制定规则,并用来校验数据格式的合法性。


二、正则表达式的匹配规则

匹配方法:
java 正则匹配,JavaSE,正则表达式,java,开发语言,leetcode,算法

字符类(默认匹配一个字符):                预定义的字符类(默认匹配一个字符):
java 正则匹配,JavaSE,正则表达式,java,开发语言,leetcode,算法

贪婪的量词(配合匹配多个字符):
java 正则匹配,JavaSE,正则表达式,java,开发语言,leetcode,算法
注:X 代表前两框的字符类。

举例:

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

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

        System.out.println("a".matches("\\d")); // false
        System.out.println("3".matches("\\d")); // true
        System.out.println("333".matches("\\d")); // false 因为只匹配一个字符,多个字符直接就 false
        System.out.println("z".matches("\\w")); // true
        System.out.println("2".matches("\\w")); // true
        System.out.println("21".matches("\\w")); // false 因为只匹配一个字符,多个字符直接就 false
        System.out.println("你".matches("\\w")); //false
        System.out.println("你".matches("\\W")); // true
        System.out.println("---------------------------------");
        //  以上正则匹配只能校验单个字符。

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

        // 验证码 必须是数字和字符  必须是4位
        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
    }
}

三、正则表达式在方法中的应用

3.1 校验手机号、邮箱和座机电话号码

public class RegexDemo02 {
    public static void main(String[] args) {
        // 校验手机号码 邮箱 电话号码
        checkPhone();
        checkEmail();
        checkTel();
    }

	// 校验手机号
    public static void checkPhone(){
        Scanner sc = new Scanner(System.in);
        while(true){
            System.out.print("输入手机号:");
            String phone = sc.next();
            // 判断手机号的格式是否正确
            if(phone.matches("1[3-9]\\d{9}")){
                System.out.println("成功!");
                break;
            }else{
                System.out.println("失败!");
            }
        }
    }

	// 校验邮箱
    public static void checkEmail(){
        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.print("请您输入您的注册邮箱:");
            String email = sc.next();
            // 判断邮箱格式是否正确   3268847878@qq.com
            // 判断邮箱格式是否正确   3268847dsda878@163.com
            // 判断邮箱格式是否正确   3268847dsda878@pci.com.cn
            // "."代表任何字符,"\\."等同于 \. 是纯 .
            if(email.matches("\\w{1,30}@[a-zA-Z0-9]{2,20}(\\.[a-zA-Z0-9]{2,20}){1,2}")){
                System.out.println("邮箱格式正确,注册完成!");
                break;
            }else {
                System.out.println("格式有误!");
            }
        }
    }

	// 校验电话号码(座机)
    public static void checkTel(){
        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("请您输入您的电话号码:");
            String tel = sc.next();
            // 判断电话号码格式是否正确   027-3572457  0273572457
            if(tel.matches("0\\d{2,6}-?\\d{5,20}")){
                System.out.println("格式正确,注册完成!");
                break;
            }else {
                System.out.println("格式有误!");
            }
        }
    }
}

3.2 字符串的内容替换和分割

java 正则匹配,JavaSE,正则表达式,java,开发语言,leetcode,算法

举例1:在字符串中寻找姓名

public class RegexDemo03 {
    public static void main(String[] args) {
        String names = "小路dhdfhdf342蓉儿43fdffdfbjdfaf小何";

        String[] arrs = names.split("\\w+");
        for (int i = 0; i < arrs.length; i++) {
            System.out.println(arrs[i]); // 小路 蓉儿 小何
        }

        String str = names.replaceAll("\\w+", "**");
        System.out.println(str); // 小路**蓉儿**小何

        String[] strArr = str.split("\\*\\*");
        for (int i = 0; i < strArr.length; i++) {
            System.out.println(strArr[i]);
        }
    }
}

举例2:正则表达式爬取信息中的内容

public class RegexDemo04 {
    public static void main(String[] args) {
        String rs = "来黑马程序学习Java,电话020-43422424,或者联系邮箱" +
                "itcast@itcast.cn,电话18762832633,0203232323" +
                "邮箱bozai@itcast.cn,400-100-3233 ,4001003232";

        // 需求:从上面的内容中爬取出 电话号码和邮箱。
        // 1、定义爬取规则,字符串形式
        String regex = "(\\w{1,30}@[a-zA-Z0-9]{2,20}(\\.[a-zA-Z0-9]{2,20}){1,2})|"+
                "(0\\d{2,6}-?\\d{5,20})|(400-?\\d{3,9}-?\\d{3,9})";

        // 2、把这个爬取规则编译成匹配对象。
        Pattern pattern = Pattern.compile(regex);

        // 3、得到一个内容匹配器对象
        Matcher matcher = pattern.matcher(rs);

        // 4、开始查找
        while (matcher.find()) {
            String rs1 = matcher.group();
            System.out.println(rs1);
        }
    }
}

四、编程题目

4.1 表示数值的字符串

剑指 Offer 20. 表示数值的字符串:https://leetcode.cn/problems/biao-shi-shu-zhi-de-zi-fu-chuan-lcof/

题目描述:

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。

数值(按顺序)可以分成以下几个部分:

  1. 若干空格
  2. 一个 小数 或者 整数
  3. (可选) 一个 ‘e’ 或 ‘E’ ,后面跟着一个 整数
  4. 若干空格

小数(按顺序)可以分成以下几个部分:

  1. (可选) 一个符号字符( ‘+’ 或 ‘-’ )
  2. 下述格式之一:
    1. 至少一位数字,后面跟着一个点 ‘.’
    2. 至少一位数字,后面跟着一个点 ‘.’ ,后面再跟着至少一位数字
    3. 一个点 ‘.’ ,后面跟着至少一位数字

整数(按顺序)可以分成以下几个部分:

  1. (可选) 一个符号字符(‘+’ 或 ‘-’)
  2. 至少一位数字

部分数值列举如下:

["+100", "5e2", "-123", "3.1416", "-1E-16", "0123"]

部分非数值列举如下:

["12e", "1a3.14", "1.2.3", "+-5", "12e+5.4"]

用例:

输入 s = “0” s = “e” s = “.” s = " .1 "
输出 true false false true

代码实现:

class Solution {
    public boolean isNumber(String s) {
        // 去除首尾空格
        s = s.trim();
        return isDecimal(s) || isInteger(s);
    }

    /**
     * 判断是否是小数
     */
    public boolean isDecimal(String s){
        //(可选)一个符号字符('+' 或 '-')
        // 下述格式之一:
        //      至少一位数字,后面跟着一个点 '.'
        //      至少一位数字,后面跟着一个点 '.' ,后面再跟着至少一位数字
        //      一个点 '.' ,后面跟着至少一位数字
        String regx1 = "[+-]{0,1}[0-9]{1,20}\\.[0-9]{0,20}([eE]{1}[+-]{0,1}[0-9]{1,20}){0,1}";
        String regx2 = "[+-]{0,1}\\.[0-9]{1,20}([eE]{1}[+-]{0,1}[0-9]{1,20}){0,1}";
        return s.matches(regx1) || s.matches(regx2);
    }

    /**
     * 判断是否是整数
     */
    public boolean isInteger(String s){
        //(可选)一个符号字符('+' 或 '-')
        //  至少一位数字
        String regx1 = "[+-]{0,1}[0-9]{1,20}([eE]{1}[+-]{0,1}[0-9]{1,20}){0,1}";
        return s.matches(regx1);
    }
}

4.2 非严格递增连续数字序列

题目描述:

输入一个字符串仅包含大小写字母和数字,求字符串中包含的最长的非严格递增连续数字序列长度。

比如:12234 属于非严格递增数字序列

输入描述:输入一个字符串仅包含大小写字母和数字

输出描述: 输出字符串中包含的最长的非严格递增连续数字序列长度

用例:

输入 abc2234019A334bc abc02a234019A334bc
输出 4 3

本题思路:

通过正则表达式,分割字符串中的数字部分,再使用滑动窗口算法解决递增序列问题。

代码实现:

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();
        String[] nums = str.split("[a-zA-Z]{1,}");
        // ["", "02", "234019", "334"]
        int maxLen = 0;
        for(int i = 0; i < nums.length; i ++){
            if(!nums[i].isEmpty()){
                maxLen = Math.max(maxLen, getNumsLength(nums[i]));
            }
        }
        System.out.println(maxLen);
    }

    // abc02a234019A334bc
    // 滑动窗口求最大长度
    public static int getNumsLength(String num){
        int sum = 1;
        int start = 0;
        for(int end = 1; end < num.length(); end ++){
            char ch = num.charAt(end);
            if(ch - num.charAt(end-1) >= 0){
                sum = Math.max(sum, end-start+1);
            }else{
                start = end;
            }
        }
        return sum;
    }
}

文章参考:Java入门基础视频教程,java零基础自学就选黑马程序员Java入门教程(含Java项目和Java真题)文章来源地址https://www.toymoban.com/news/detail-647691.html

到了这里,关于Java 基础进阶篇(十八):正则表达式匹配规则和应用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java 正则表达式【非贪婪匹配、格式验证、反向引用、API】

    非贪婪匹配的元字符是问号 ?  当此字符跟在任何其他限定符(*、+、?、{n}、{m}、{n,m})之后,匹配模式是 \\\"非贪心的\\\"。非贪心的意思就是每次匹配搜索到的尽可能短的字符串, 可以是0个 。 对比贪婪匹配和非贪婪匹配 贪婪匹配 输出结果: 非贪婪匹配 输出结果: 对字符串

    2024年02月13日
    浏览(16)
  • java正则表达式匹配替换大括号变量${}和替换${}变量的值

    java正则表达式替换“$ {}”特殊字符并还原,以及java正则表达式替换${}变量为变量的值这两种操作的代码示例。 正则表达式还是非常有用的, 可以耐心看下定义,多尝试下。 正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将

    2024年02月02日
    浏览(27)
  • 【Go】Go 文本匹配 - 正则表达式基础与编程中的应用 (8000+字)

             本文共计8361字,预计阅读时间18分钟         正则表达式(Regular Expression, 缩写常用regex, regexp表示)是计算机科学中的一个概念,很多高级语言都支持正则表达式。 目录 何为正则表达式 语法规则 普通字符 字符转义 限定符 定位符 分组构造 模式匹配 regexp包

    2024年02月12日
    浏览(20)
  • 【正则表达式】正则表达式常见匹配模式

    模式 描述 w 匹配字母数字及下划线 W 匹配非字母数字下划线 s 匹配任意空白字符,等价于 [tnrf]. S 匹配任意非空字符 d 匹配任意数字,等价于 [0-9] D 匹配任意非数字 A 匹配字符串开始 Z 匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串 z 匹配字符串结

    2024年02月09日
    浏览(43)
  • 【Java 进阶篇】JavaScript 正则表达式(RegExp)详解

    JavaScript 正则表达式,通常简写为 RegExp,是一种强大的文本匹配工具,它允许你通过一种灵活的语法来查找和替换字符串中的文本。正则表达式在编程中用途广泛,不仅限于 JavaScript,在许多编程语言中也都有类似的实现。 正则表达式,简称正则或RegExp,是一个用于描述字符

    2024年02月07日
    浏览(30)
  • 正则表达式 (用于灵活匹配文本的表达式)

    目录 . * 用于匹配任意单个字符,除了换行符。 例如使用正则表达式 a.b, 它可以匹配aab、acb、a#b 用于匹配前一个字符零次或多次。 例如,使用正则表达式 ab*c ,它可以匹配 \\\"ac\\\"、\\\"abc\\\"、\\\"abbc\\\",因为 b* 表示匹配零个或多个字符 \\\"b\\\"。所以,这个表达式可以匹配 \\\"ac\\\"(零个 \\\"b\\\"),

    2024年01月16日
    浏览(43)
  • 【Java 基础篇】Java 正则表达式

    正则表达式是一种强大的文本模式匹配工具,它可以帮助我们在文本中查找、替换和提取特定模式的内容。Java 提供了丰富的正则表达式支持,通过 java.util.regex 包中的类和方法,我们可以在 Java 程序中使用正则表达式进行字符串处理。 本篇博客将介绍 Java 正则表达式的基本

    2024年02月09日
    浏览(30)
  • java中通过split方法使用分号分割,使用正则表达式匹配不识别单引号中的分号

    在Java中,使用split()方法可以通过指定正则表达式作为分隔符来拆分字符串。如果你想忽略单引号内的分号,可以使用以下代码: 在这个正则表达式中,它使用反向零宽断言 (?!...) 和顺序零宽断言 (?=...) 来限制分隔符的匹配位置,以确保只有在非单引号内部的位置才会进行分

    2024年02月08日
    浏览(27)
  • 正则表达式的神奇世界:表达、匹配和提取

    正则表达式,这个看起来像密林中的迷宫的工具,既神秘又令人着迷。它是编程世界中的一门魔法,有着神奇的能力。你是否曾经在寻找或解析文本时感到束手无策?或许你想要从海量数据中提取特定信息?这正是正则表达式可以派上用场的时候。本文将带你探索这个神奇的

    2024年02月07日
    浏览(34)
  • java基础知识——23.正则表达式

    这篇文章我们简略的讲一下java的正则表达式 目录 1.正则表达式概述 2.正则表达式的简单匹配规则 3.正则表达式的复杂匹配规则 4.正则表达式的分组匹配规则 5.正则表达式的非贪婪匹配 6.使用正则表达式进行搜索和替换 首先,我们需要明确一个观点,什么是正则表达式? 正则

    2024年02月01日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包