java学习-第24天

package com;

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

public class Mather_02 {
    public static void main(String[] args) {
        // test1();
        // test2();
        // test3();
        test4();
    }

    // 1 matches : 全词匹配
    public static void test1() {
        String input = "13113113111";
        String regex = "\\d{11}";

        // 创建正则表达式引擎对象
        Pattern pattern = Pattern.compile(regex);
        // 创建匹配器
        Matcher matcher = pattern.matcher(input);
        // 匹配
        boolean result = matcher.matches();
        System.out.println(result);
    }

    // 2 lookingAt : 从前往后匹配,前面符合条件就行
    public static void test2() {
        String input = "13113113111asd";
        String regex = "\\d{11}";

        // 创建正则表达式引擎对象
        Pattern pattern = Pattern.compile(regex);
        // 创建匹配器
        Matcher matcher = pattern.matcher(input);
        // 匹配
        boolean result = matcher.lookingAt();
        System.out.println(result);
    }

    // 3 find : 任意位置符合条件都可以
    public static void test3() {
        String input = "asd13113113111asd";
        String regex = "\\d{11}";

        // 创建正则表达式引擎对象
        Pattern pattern = Pattern.compile(regex);
        // 创建匹配器
        Matcher matcher = pattern.matcher(input);
        // 匹配
        boolean result = matcher.find();
        System.out.println(result);
    }

    // 4 group : find和group一起使用,可以做到数据提取
    public static void test4() {
        String input = "张小三的电话号码是13113113111s@##李四的电话号码是13113113112王五的电话号码是13113113113";
        // [\u4E00-\u9FFF] 汉字范围
        String regex = "([\u4E00-\u9FFF]{2,3})的电话号码是(\\d{11})";

        // 创建正则表达式引擎对象
        Pattern pattern = Pattern.compile(regex);
        // 创建匹配器
        Matcher matcher = pattern.matcher(input);
        // 匹配
        while (matcher.find()) {
            // group() 和 group(0) 都是提取匹配到的数据
            // 1 就是第一组数据(第一个小括号) , 2 就是第二组数据
            // System.out.println(matcher.group());
            // System.out.println(matcher.group(0));
            System.out.println(matcher.group(1)+" : "+matcher.group(2));
        }
    }
}

package com;

import java.util.regex.Pattern;

/**
 * 正则表达式 定义了字符串的模式,可以用来搜索,编辑,处理文本,并不仅限于某一种语言
 * 
 * 但是在每种语言中也会有细微的差别
 * 
 * jdk1.4推出正则表达式, 保存在java.util.regex包下
 * 
 * 正则表达式常用语法 : 
 *        \ : 转移符,把有意义字符转换为无意义字符
 *    范围相关
 *        [abc] : 可能是a,可能是b,也可能是c    
 *        [a-z] : 可以匹配到小写字母
 *        [A-Za-z] : 可以匹配到大小写字母
 *        [A-Za-z0-9] : 大小写字母和数字
 *        [0-9] : 匹配数字   
 *        [^0-9] : 匹配不是数字
 *    简洁表示方式
 *        . : 匹配任意字符,如果想匹配 .  需要转义 \.
 *     \d : 表示数字  等价于 [0-9]
 *      \D : 并表示非数字 [^0-9]
 *        \s : 表示由空字符组成
 *        \S : 表示非空
 *        \w : 表示字母,数字,下划线 [0-9a-zA-Z_]
 *        \W : 表示非字母数字下划线
 * 数量相关 : 
 *         ? : 表示出现0次或1次
 *         + : 表示出现1次或多次,大于等于1
 *         * : 大于等于0
 *         {n} : 表示出现n次 , [0-9]{6} : 表示出现6位数字
 *         {n,} : 表示出现n次或n次以上 , 就是大于等于n , \d{6,} : 表示出现至少6个数字
 *         {n,m} : 表示出现n到m次 , \d{6,9} : 表示出现6到9个数字
 * 
 *         | : 或 , x|y 表示出现x或者是y
 *         () : 子表达式,看做一个整体
 *                 ([0-9]张){5}
 * 
 * 匹配整数和小数
 *         ^\d+(\.\d+)?$
 *             ^ : 表示开始,以xxx打头
 *             $ : 表示结束
 *             一般想要强制全词匹配的时候,才加^和$
 *             \d : 匹配数字
 *             + : 匹配一个或多个
 *             (\.\d+) : 把\.和\d+看做整体
 *             ? : 只能出现0次或1次
 *     [a-zA-Z_$][a-zA-Z0-9_$]* 
 * 
 * java中有三个正则表达式相关的类
 *         PatternSyntaxException : 正则表达式异常类
 *         Pattern : 正则表达式类
 *         Matcher : 支持较强大的正则表达式匹配操作
 *     
 * 实际操作中,有时候简单的校验操作,可以直接使用String的
 *         验证 : boolean matches(String regex)
 *         拆分 : String[] split(String regex)
 *         替换 : String replacaAll(String regex,String str)
 * 
 * @author SEC90
 * @Date 2022年2月9日 下午3:09:52
 */
public class Pattern_01 {
    public static void main(String[] args) {
//        test1();
        test2();
    }
    // 匹配
    public  static void test2(){
        // 内容
        String str = "23.456";
        // 正则表达式
        String regex = "\\d+(\\.\\d+)?";
        // 创建引擎对象
        Pattern pattern = Pattern.compile(regex);
        // 匹配 , 并且是全词匹配
        boolean result = pattern.matches(regex, str);
        System.out.println(result);
    }
    // 拆分
    public static void test1(){
        String string = "1.2.3.4.5";
        // 创建正则表达式引擎对象
        // 注意,所有以 . 进行操作的 都要转义,而在java中 使用正则表达式的转移符 要写两个
        // 因为在java中\ 也是转移符
        Pattern pattern = Pattern.compile("\\.");
        // 调用拆分方法
        String[] arr = pattern.split(string);
        for (String string2 : arr) {
            System.out.println(string2);
        }
        
        // String中的拆分
        arr = string.split("\\.");
        for (String string2 : arr) {
            System.out.println(string2);
        }
    }
}
 

package com;

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

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

        // 还原成 : 我要学编程
        String input = "我我...我我...我要..要要...要要...学学学....学学...编编编..编程..程.程程...程...程";
        // 1 把.去掉
        input = input.replaceAll("[^\u4E00-\u9FFF]", "");
        // 我我我我我要要要要要学学学学学编编编编程程程程程程
        System.out.println(input);

        // (.) : 任意字符组成
        // \\1 获取前面组中的数据
        // (\\d)\\1 : 表示两个连续出现的数字, 比如 11,22,33,44
        // (\\d)(a)\\1 : 表示 第一个和第三个是相同的数字,且数字中间有个a ,1a1,9a9
        // (\\d)(a)\\2 : 表示 第一个是数字,第二个和第三个都是a,1aa,3aa
        String regex = "(.)(\\1+)";

        // 创建正则表达式引擎对象
        Pattern pattern = Pattern.compile(regex);
        // 创建匹配器
        Matcher matcher = pattern.matcher(input);
        // find查找
        // while (matcher.find()) {
        // // 使用 group(1)把group(0) 替换即可
        // input = input.replaceAll(matcher.group(), matcher.group(1));
        // }

        // $1 就是 group(1) 而 regex 就等于是group();
        input = input.replaceAll(regex, "$1");
        System.out.println(input);
    }
}

package day_02;

import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.util.Scanner;

/**
 * UDP 速度快,不可靠,不面向链接, 相当于发短信
 * 
 * @author SEC90
 * @Date 2022年2月9日 下午2:05:18
 */
public class UDPClient {
    public static void main(String[] args) throws Exception {
        while (true) {
            Scanner scanner = new Scanner(System.in);
                    // 要发送的数据
            String string = scanner.nextLine();
            // 创建字节数组输出流
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            // 创建数据流
            DataOutputStream dos = new DataOutputStream(baos);
            // 写出数据,把数据写到字节数组流中,同时保存了数据类型
            dos.writeUTF(string);
            // 把数据转换为字节数组
            byte[] buf = baos.toByteArray();
//            System.out.println(new String(buf));
            
            // 数据传输
            // 创建数据包,把数据进行打包
            // 并绑定服务端地址和端口
            DatagramPacket dp = new DatagramPacket(buf, buf.length,new InetSocketAddress("127.0.0.1", 10000));
            
            // 传输,需要本地开启端口把数据发送出去
            DatagramSocket ds = new DatagramSocket(9999);
            // 发送数据包
            ds.send(dp);
            // 关闭资源
            ds.close();
            System.out.println("发送完成");
        }

        
    }
}

package day_02;

import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;

public class UDPServer {
    public static void main(String[] args) throws Exception {
        // 打开UDP对象,并监听某个端口,用于接收数据
        DatagramSocket ds = new DatagramSocket(10000);
        // 创建字节数组,用于保存接收到的数据
        byte[] buf = new byte[1024];
        // 声明一个包接收器
        DatagramPacket dp = new DatagramPacket(buf, buf.length);
        
        while (true) {
            // 通过开启的端口接收数据
            ds.receive(dp);
            
            ByteArrayInputStream bais = new ByteArrayInputStream(buf);
            DataInputStream dis = new DataInputStream(bais);
            System.out.println(dis.readUTF());
        }
    }
}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值