首页 > 其他分享 >Day37:正则表达式详解

Day37:正则表达式详解

时间:2022-12-10 21:33:05浏览次数:127  
标签:String 正则表达式 Day37 System 详解 println public out

正则表达式

1.1 概述

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

比如我们在网站上输入用户账号,要求我们输入的账号信息要符合账号的格式,而校验我们输入的账号格式是否正确正是由

正则表达式所控制的。

1.2 与普通方法的对比

案例:要求校验QQ账号的格式,账号信息全为数字,位数在6-12位之间。

我们不使用正则表达式进行编码:

import java.util.Scanner;
public class Test{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        System.out.println("请输入QQ账号");
        String a=sc.nextLine();
        System.out.println(checkQQ(a));
    }
    
    
    //校验QQ账号信息的方法
    public static boolean checkQQ(String a){
        if(a==null){//账号为空则返回false
            return false;
        }
        if(a.length()>12||a.length()<6){//控制账号长度
            return false;
        }
        for(i=0;i<a.length();i++){
            char c=a.char(i);//控制账号全为数字
            if(c<"0"||c>"9"){
                return false;
            }
        }
        return true;//以上方法将非数字、超长度的情况进行了排除,留下来的必定符合要求
    }
}
请输入QQ账号
87398177a
false

以上是我们不通过正则表达式来写的代码,可以看出来比较繁琐;

接下来我们用正则表达式来实现我们QQ账号信息的校验

public class Test{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        System.out.println("请输入QQ账号");
        String a=sc.nextLine();
        System.out.println(checkQQ2(a));
    }
    public static boolean checkQQ2(String a){
        return a!=null&a.matches("\\d{6,12}");//matches是使用正则表达式的方法
       }
}

我们可以观察到正则表达式应用在校验数据格式的情况时代码非常的简单

1.3 匹配规则

字符类(默认只匹配一个字符)

符号 说明
[abc] 只能是a、b、c其中一个
[^abc] 除了a、b、c都可以
[a-zA-Z] a-z以及A-Z中的一个
[a-d[m-p]] a-d或者m-p中的一个
[a-z&&[def]] a-z和def的交集中的一个

预定义的字符类(默认只匹配一个字符)

符号 说明
. 任意字符
\d 一个数字[0-9]
\D 非数字:[ ^0-9 ]
\s 一个空白符:[\t\n\x0B\f\r]
\S 非空白符:[^\s]
\w 英文、数字、下划线 [a-zA-Z_0-9]
\W 一个非单词英文[^W]

贪婪的量词(配合匹配多个字符

符号 说明
X? X,一次或者没有
X* X,0次或者多次
X+ X,一次或者多次
X{n} X,n次
X{n,} X,至少n次
X{n,m} X,n-m次

1.4 常见案例

  • 请编写程序模拟用户输入手机号码,验证格式是否正确并给出提示直到格式输入正确为止
  • 请编写程序模拟用户输入邮箱号码,验证格式是否正确并给出提示直到格式输入正确为止
  • 请编写程序模拟用户输入座机号码,验证格式是否正确并给出提示直到格式输入正确为止
import java.util.Scanner;
//正则表达式检查用户输入的数据是否符合要求
public class MobliePhoneCheck {
    public static void main(String[] args) {
        //checkMp();
        //checkEmail();
        checkTel();
    }

    //正则表达式检查用户输入的手机号码是否符合要求
    public static void checkMp(){
        Scanner sc = new Scanner(System.in);
        while (true) {//巧用while循环   CTRL+alt+t  快速生成while循环
            System.out.println("请输入您的手机号码");
            String s=sc.nextLine();
            if(s.matches("1[3-9]\\d{9}")){//手机号码开头为1、第二位数为3-9、后面再跟9为数字
                System.out.println("手机号码输入成功");
                break;//记得打破循环
            }else {
                System.out.println("手机号码格式有误");
            }
        }
    }
    //邮箱格式检测  [email protected]  [email protected]  [email protected]  满足三种形式
    //数字位6-12位;一个@;邮箱类型含数字和英文;域名两级
    public static void checkEmail(){
        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("请输入您的邮箱号码");
            String s=sc.nextLine();
            if(s.matches("\\d{6,12}@[a-zA-Z0-9]{2,3}(\\.[a-zA-Z]{3}){1,2}")){
                System.out.println("邮箱输入成功");
                break;
            }
            else {
                System.out.println("邮箱格式有误");
            }
        }
    }

    //座机号码检测  区位三个,号码8个
    public static void checkTel(){
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入座机号码");
        String a=sc.nextLine();
        if(a.matches("0\\d{2}-?\\d{8}")){
            System.out.println("座机号码输入成功");
        }else{
            System.out.println("座机号码格式有误");
        }

    }

1.5 正则表达式的方法

方法名 说明
public String replaceAll(String regex,String newStr) 将正则表达式指定的内容替换成想要内容
public String[] split(String regex) 将正则表达式指定的内容作为分隔符(注意返回的是数组)

下面对方法进行演示

import java.util.Arrays;

public class ExpressionMethod {
    public static void main(String[] args) {

        //split 将正则表达式指定的格式作为分隔符分隔字符串并返回数组
        String a="中交sadee二航局saj41523Jianzh建筑工程有限公司";
        String[] s=a.split("[a-zA-Z0-9]+");
        System.out.println(Arrays.toString(s));//用数组重写的toString打印
        for (int i = 0; i < s.length; i++) {//或者for循环遍历出来
            System.out.println(s[i]);
        }
        //replaceAll  将正则表达式指定的格式的内容替换成自己想要的内容
        String b=a.replaceAll("[]a-zA-Z0-9]+","\t");
        System.out.println(b);

    }

1.6 拓展——爬取信息

在一堆杂乱的信息中获取到有效的信息:电话号码、邮箱等等......

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class GetImformation {
    //利用正则表达式在一堆信息中提取有效的信息
    /*
    来自中交二航局的牛马人编号20210710,电话17989148888;邮箱号码:[email protected]
     */
    public static void main(String [] args){
        String e="来自中交二航局的牛马人编号20210710,电话17989148888;邮箱号码:[email protected]";
        //提取有效信息第一步:  先创建一个正大表达式规则
        String a="\\d{9}@[a-zA-Z0-9]{2,3}(\\.[a-zA-Z]{3}){1,2}|\\d{1,11}|1[3-9]\\d{9}" ;
        //第二步:编译规则并封装成一个编译器Pattern
        Pattern p=Pattern.compile(a);//compile为编译的意思,将我们指定的规则编译
        //第三步:调用编译器匹配功能生成一个匹配器  Matcher  即用编译器的规则去匹配目标内容
        Matcher m = p.matcher(e);
        //第四步:调用匹配器的查找功能:find;调用group方法将查找到的内容生成一个新的字符串:group
        while (m.find()){
            String g = m.group();
            System.out.println(g);
        }
    }
}

标签:String,正则表达式,Day37,System,详解,println,public,out
From: https://www.cnblogs.com/CQliuwei/p/16972378.html

相关文章

  • 前端开发系列034-基础篇之RegExp正则表达式
    title:'前端开发系列034-基础篇之RegExp正则表达式'tags:-javaScript系列categories:[]date:2017-09-1720:20:13本文介绍RegExp相关的知识点,包括正则表达式的......
  • (转)linux expect 详解
    原文:https://blog.csdn.net/zxycyj1989/article/details/125837697介绍expect是由DonLibes基于Tcl(ToolCommandLanguage)语言开发的,主要应用于自动化交互式操作的场景,......
  • Python正则表达式
    Python正则表达式情况:在一个EXCEL文件中,记录了众多公司的账目,单位有万元和亿元,彼此混杂。现想把单位统一为万元,且不显示出来法一:利用EXCEL的公式=IF(VALUE(MID(B2,1,......
  • lightdb enterprise postgres wal详解之整体体系及pg_waldump、pg_switch_wal的实现
    除了源码,了解WAL最好的方式是通过lt​​_waldump​​入手:[lightdb@lightdb1bin]$./lt_waldump--helplt_waldumpdecodesanddisplaysLightDBwrite-aheadlogsfor......
  • benchmarksql详解及支持mysql、达梦、citus的lightdb benchmarksql分支
    为什么使用benchmarksql压测?因为大多数应用系统使用java开发,并且不使用存储过程,故使用benchmarksql压测数据库最公平,既可以测试数据库,也可以测试JDBC驱动。可以用来......
  • Python | time和datetime模块详解
    对时间进行处理 python与时间处理相关的模块有两个:time模块和datetime模块(python的内置标准库,不需要去下载)datetime模块,常用类4个(date,time,datetime,timedelta)......
  • STM32单片机的最小系统的组成详解
    经常使用STM32开发的工程师对于它的开发环境的最小系统是必须要有所了解的,特别是硬件工程师在设计硬件的时候对这个最小系统就要更加的深入了解了,如果最小系统的搭建都有问......
  • Backbone 网络-ResNet v2 详解
    本文发现当使用恒等映射(identitymapping)作为快捷连接(skipconnection)并且将激活函数移至加法操作后面时,前向-反向信号都可以在两个block之间直接传播而不受到任......
  • 智慧消防解决方案(智慧消防解决方案厂家详解)
    ​智慧火灾报警工业路由器是一种特殊的工业网关,它主要应用在火灾报警领域。智慧火灾报警工业路由器通过网络连接火灾报警设备,实现火灾报警信息的实时监控和自动报警。它具......
  • 由浅入深,详解 LiveData 的那些事
    引言关于​​LiveData​​​,在2022尾声的今天,从事​​Android​​​开发的小伙伴一定不会陌生。相应的,关于​​LiveData​​解析与使用的文章更是数不胜数,其中不乏优秀......