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());
}
}
}