正则表达式

本文介绍正则表达式的概念及应用,包括限定修饰符、快捷符号等基础知识,并通过多个示例展示如何使用Java进行字符串匹配、切割、替换及获取等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概念

正则表达式通常被用于判断语句,用来检查某一个字符串是否满足某一格式。正则表达式是含有一些具有特殊意义字符的字符串,这些特殊字符称为正则表达式的元字符。

1.限定修饰符:在正则表达式中国允许使用限定修饰符来限定元字符出现的次数。
这里写图片描述

2.常见正则表达式创建的快捷符号:
这里写图片描述

3.在正则表达式中可以使用方括号括起来若干字符来表示一个元字符,该元字符可代表方括号中的任何一个字符。

代码示例:

package regex.demo;
/*
正则表达式

正则表达式用于操作字符串数据
通过一些特定的符合来体现的

所以为了掌握正则表达式,必须要学习一些符号

虽然简化了,但是阅读性差

*/
public class RegexDemo {

    public static void main(String[] args) {

        String qq="1234567865j";
//      checkQQ(qq);//非正则表达式的方法

        String regex="[1-9][0-9]{4,14}";//正则表达式

        boolean b=qq.matches(regex);
        System.out.println(qq+":"+b);


        String str="aoob";
        String reg="ao?b";//ao+b  ao*b
        System.out.println(str.matches(reg));

    }

    public static void checkQQ(String qq){

/*  
        需求:定义一个功能对qq号进行校验

        要求:长度5~15,只能是数字,0不能开头

*/

            int len=qq.length();
            if(len>=5&&len<=15){
                if(!qq.startsWith("0")){
                    try{

                        long l=Long.parseLong(qq);
                        System.out.println(l+":正确");
                    }catch(NumberFormatException E){
                        System.out.println(qq+":含有非法的字符");
                    }

                }else{

                    System.out.println(qq+":不能以0开头");
                }
            }else{
                System.out.println(qq+":长度错误");
            }
    }
}

正则表达式对字符串的常见操作

1.匹配
其实使用的就是String类中的matches方法;

2.切割
其实使用的就是String类中的split方法;

3.替换
其实使用的就是String类中的replaceAll()方法;

4.获取

public class RegexDdemo2 {

    public static void main(String[] args) {

        /*

         正则表达式对字符串的常见操作
         1.匹配
         其实使用的就是String类中的matches方法

         2.切割
         其实使用的就是String类中的split方法

         3.替换
         其实使用的就是String类中的replaceAll()方法

         4.获取

         * 
         * */

        functionDemo_4();

    }

    /*
     * 获取
     //将正则规则进行对象的封装
     Pattern p=Pattern.compile("a*b");
     //通过正则对象的matcher方法和字符串相关联,获取要对字符串操作的匹配对象Matcher
     Matcher m=p.matcher("aaaaab");
     //通过Matcher匹配器对象的方法对字符串进行操作
     boolean b=m.matches();

     * */
    public static void functionDemo_4() {

        String str="welcome to chengdu,the hotpot is very delicious woo";

        String regex="\\b[a-z]{3}\\b";
        //将正则封装成对象
        Pattern p=Pattern.compile(regex);
        //2.通过正则对象获取匹配器对象
        Matcher m=p.matcher(str);
        //使用Matcher对象的方法对字符串进行操作
        //既然要获取三个字母组成的单词
        //查找 find();

        while(m.find()){
            System.out.println(m.group());//获取匹配的子序列

            System.out.println(m.start()+":"+m.end());
        }

    }


    /*
     * 替换
     * */

    public static void functionDemo_3() {

        String str="zhangsantttttxiaoqiangmmmmmzhaoliu";

        str=str.replaceAll("(.)\\1+", "$1");

        System.out.println(str);

        String tel="15800001111";//158****1111

        tel=tel.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");

        System.out.println(tel);

    }


    /*
     * 切割
     * 
     * 组: ((A)(B(C))) 第一组:((A)(B(C))) 第二组\A 第三组(B(C))第四组(C)
     * 组零始终代表整个表达式
     * 
     * 捕获组可以通过计算从左到右计算器开括号来编号。
     * */
    public static void functionDemo_2() {

        String str="zhangsan xiaoqiang   zhaoliu";
        String str1="zhangsan.xiaoqiang.zhaoliu";

        String str2="zhangsantttttxiaoqiangmmmmmzhaoliu";

        String[] names=str.split(" +");//空格出现一次或者多次
        String[] names1=str1.split("\\.");
        String[] names2=str2.split("(.)\\1+");//任意字符出现多次作为分隔符,组的应用
        for(String name2:names2){
            System.out.println(name2);
        }
    }


    /*
     * 演示匹配
     * */

    public static void functionDemo_1(){

//      匹配手机号码是否正确

        String tel="15800001111";

        String regex="1[358]\\d{9}";//1[358][0-9]{9}

        boolean b=tel.matches(regex);
        System.out.println(tel+":"+b);
    }

}

注意:
1.Java的正则表达式是由java.util.regex的Pattern和Matcher类实现的。Pattern对象表示经编译的正则表达式。静态的compile( )方法负责将表示正则表达式的字符串编译成Pattern对象。只要给Pattern的matcher( )方法送一个字符串就能获取一个Matcher对象。

2.在正则表达式中“.”代表任何一个字符,因此在正则表达式中如果想要使用普通意义的点字符“.”,必须使用转义字符“\”。

3.组(Group)是指里用括号括起来的,能被后面的表达式调用的正则表达式。

正则表达式的应用

public class RegexTest {

    public static void main(String[] args) {

        /*
        1. 治疗口吃:我我...我我...我我我要...要要要要...要要要要...学学学学学学...学学...编编编......程程程...程程。
        2. 对ip地址排序。
        3. 对邮件地址校验。
        */

        test_3();
    }

    //治疗口吃
    public static void test_1(){

        String str="我我...我我...我我我要...要要要要...要要要要...学学学学学学...学学...编编编...编...程程程...程程。";

        //将字符串中的“.”去掉,用替代。
        str=str.replaceAll("\\.+", "");
//      System.out.println(str);
        //替换叠词
        str=str.replaceAll("(.)\\1+", "$1");
        System.out.println(str);
    }

/*  
    ip地址排序

    (4192.168.10.343127.0.0.113.3.3.32105.7.11.55



    */
    public static void test_2(){

        String ip_str="192.168.10.34  127.0.0.1   3.3.3.3   105.7.11.55";


        //为了让ip可以按照字符串顺序进行比较,只要让ip的每一段的位数相同。
        //所以,补零,按照每一位所需最多0进行补充。每一段都加两个0

        ip_str=ip_str.replaceAll("(\\d+)", "00$1");

        //每一段保留数字3位
        ip_str=ip_str.replaceAll("0*(\\d{3})", "$1");
        System.out.println(ip_str);

        //将ip地址切出
        String[] ips=ip_str.split(" +");

        TreeSet<String> ts=new TreeSet<String>();

        for(String ip:ips)
            ts.add(ip);

        for(String ip:ts)
            System.out.println(ip.replaceAll("0*(\\d+)", "$1"));

    }

    //对邮件地址校验
    public static void test_3(){

        String mail="abc1@sina.com.cn";

        String regex="[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]{1,3})+";
        regex="\\w+@\\w+(\\.\\w+)+";

        boolean b=mail.matches(regex);

        System.out.println(mail+":"+b);
    }


}

网页爬虫

/*
网页爬虫:其实就是一个程序用于在互联网中获取符合指定规则的数据。
爬取邮箱地址。


*/
public class RegexTest2 {

    public static void main(String[] args) throws IOException {

        List<String> list=getMailsByWeb();

        for(String mail:list){
            System.out.println(mail);
        }

    }

    public static List<String> getMailsByWeb() throws IOException {
        //1. 读取源文件
//      BufferedReader bufr=new BufferedReader(new FileReader("c:\\mail.html"));

        URL url=new URL("https://www.douban.com/group/blabla/");
        BufferedReader bufIn=new BufferedReader(new InputStreamReader(url.openStream()));

        //2. 对读取的数据进行规则的匹配。从中获取符合规则的数据。
        String mail_regex="\\w+@\\w+(\\.\\w+)+";

        List<String> list=new ArrayList<String>();

        Pattern p=Pattern.compile(mail_regex);

        String line=null;

        while((line=bufIn.readLine())!=null){

            Matcher m=p.matcher(line);

            while(m.find()){
                //3. 将符合规则的数据存储到集合中。
                list.add(m.group());
            }   

        }
        return list;
    }

    public static List<String> getMails() throws IOException{

        //1. 读取源文件
        BufferedReader bufr=new BufferedReader(new FileReader("c:\\mail.html"));

        //2. 对读取的数据进行规则的匹配。从中获取符合规则的数据。
        String mail_regex="\\w+@\\w+(\\.\\w+)+";

        List<String> list=new ArrayList<String>();

        Pattern p=Pattern.compile(mail_regex);

        String line=null;

        while((line=bufr.readLine())!=null){

            Matcher m=p.matcher(line);

            while(m.find()){
                //3. 将符合规则的数据存储到集合中。
                list.add(m.group());
            }   

        }
        return list;

    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值