Day12(2020.06.25)

    技术2022-07-11  99

    1、正则

    正则表达式是用来描述具有一定特征的字符串的特殊字符串

    1.1 正则的用处

    验证、查找、替换、分割 。

    1.2 工具 RegexBuddy的使用

    1.3 字符集

    ​ 普通字符 精确匹配

    ​ 元字符 [] () \ ^ $ . * + ? |

    ​ 转义字符 \d \ \s \w 等

    1.4 字符类

    ​ 1.4.1 自定义 []

    ​ 1) ^ 如果在第一个位置,表示取反的含义。

    ​ 2) -表示一个区间即范围、

    ​ 3) ] 最近一个位置为:结束,表示普通 [

    ​ 4) .自身.的含义。如果需要表示原有的含义 1.4.2 默认|标准字符类

    ​ 1) \d [0,9]

    ​ 2) \w [a-zA-Z0-9]

    ​ 3) \s 空格 tab 换行

    ​ 4) . 可以匹配任意字符

    1.5 量词

    ​ 1) * 0个及以上

    ​ 2) + 1个及以上

    ​ 3) ? 0或1个

    ​ 4) {n} n次,非负数

    ​ 5) {n,} 大于等于n次

    ​ 6) {n,m} 大于等于n,小于等于m次

    1.6 贪婪模式

    ​ 1) * {n,} +贪婪模式 (匹配字符越多越好,可回溯)

    ​ 2) ?懒惰模式 (匹配字符越少越好,可回溯)

    ​ 3) +独占模式 (匹配字符越多越好,不可回溯)

    ​ 4) 阻止贪婪有两种方式: 量词后面使用? 使用取反

    1.7 边界

    ​ 1) 边界不占用宽度,只是一个界限

    ​ 2) ^ :开始 \b:单词边界 \B:非单词边界 $:结束

    ​ ^:多行代表每行头 单行代表整个字符串的开始

    ​ $: 多行代表每行尾 单行代表字符串的结尾

    ​ \b 匹配前面或后面的不是\w

    ​ \B 匹配前面或后面的是\w

    1.8 选择符与分组

    ​ 1) 选择组:| 优先级低 ,满足匹配则停止,不会查找更优的方案

    ​ 2) 分组:() 反向引用\1 \2… 非捕获组(?:xxx)

    1.9 模式修改符

    ​ 1) i:insensitive 使正则表达式对大小写不敏感;(重点)

    ​ 2) s:singleline 开启“单行模式”,即点号“.”匹配新行符;

    ​ 3) m: multiline 开启“多行模式”,即“^”和“$”匹配新行符的前面和后面的位置

    ​ 4) (?i)select(?-i) -> 不区分大小写。

    1.10 零宽断言

    ​ 1) (?=exp) 先行断言

    ​ 2) (?<=exp) 后发断言

    1.11 常用类

    ​ Pattern compile() 将给定的正则表达式编译到模式中

    ​ Matcher matcher() find() group() matches()

    ​ replaceAll() spilt()

    public class Demo01Regx { public static void main(String[] args) { String str = "hku89q3429ureisdfj38we"; //匹配三个数字 Pattern p = Pattern.compile("\\d{2}"); //在字符串中匹配 Matcher m = p.matcher(str); //System.out.println(m.group());//获取找到的内容 System.out.println(m.find());//true str = "djgrugi4jhwrh3rhk3rht8er"; str = str.replaceAll("\\d","-"); System.out.println(str);//djgrugi-jhwrh-rhk-rht-er } }

    2、计算机网络

    2.1 网络分层

    2.2 端口和URL

    ​ InetAddress

    getLocalHost() getByName(计算机名|域名|ip地址)

    getHostAddress() getHostName()

    public static void main(String[] args) throws UnknownHostException { //获取本机的地址(计算机名+ip地址) InetAddress localHost = InetAddress.getLocalHost(); System.out.println(localHost);//LAPTOP-QR5KADD9/192.168.11.195 //获取其他计算机的地址 局域网中的计算机名,域名,ip地址 InetAddress address = InetAddress.getByName("DESKTOP-V47VTGS"); System.out.println(address);//DESKTOP-V47VTGS/192.168.11.168 //获取外网中的电脑 address = InetAddress.getByName("www.baidu.com"); System.out.println(address);//www.baidu.com/180.101.49.11s //getHostAddress() 返回 ip 地址 //getHostName() 返回域名|本机为计算机名 } public static void main(String[] args) throws Exception { //百度搜索首页URL URL url = new URL("http://www.baidu.com"); //输入流 BufferedInputStream bis = null; //创建文件联系 File file = new File("baidu.html"); //输出流 BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file)); bis = new BufferedInputStream(url.openStream()); int len; byte[] car = new byte[1024]; while ((len = bis.read(car))!=-1){ bos.write(car,0,len); } bos.flush(); bis.close(); bos.close(); }

    2.3 传输层协议

    1) TCP

    ​ TCP(transfer control protocol) 打电话 面向连接、安全、可靠,效率低

    服务器端

    ​ ①创建服务器 指定端口

    ​ 创建服务器ServerSocket,在创建时定义ServerSocket的监听端口(在这个端口接收客户端发来的消息!)

    ​ ②等待客户端连接 ServerSocket调用accept()方法,使之处于阻塞状态

    ​ ③分析接收数据 利用Socket进行接收和发送数据

    客户端

    ​ ①连接服务器: 创建客户端 +指定服务器地址 +端口

    ​ 创建客户机Socket,并设置服务器的ip及端口,客户机发出连接请求,建立连接。

    ​ ②发送数据

    ​ 通过Socket发送数据,和接收数据

    public static void main(String[] args) throws Exception { //服务器端套接字 ServerSocket socket = new ServerSocket(8888); //监听 等待客户端请求连接 Socket client = socket.accept(); //输入流 BufferedInputStream bis = new BufferedInputStream(client.getInputStream()); //输出流 BufferedOutputStream bos = new BufferedOutputStream(client.getOutputStream()); //接受数据的空间 byte[] car = new byte[1024]; //读取|接收数据 int len = bis.read(car); System.out.println(new String(car, 0, len));//哈啊哈哈 //发送数据 bos.write("收到消息了".getBytes()); bos.flush(); //关闭 bos.close(); bis.close(); socket.close(); } public static void main(String[] args) throws Exception { //创立连接 目标主机地址 端口号 Socket server = new Socket(InetAddress.getLocalHost(), 8888); BufferedOutputStream bos = new BufferedOutputStream(server.getOutputStream()); BufferedInputStream bis = new BufferedInputStream(server.getInputStream()); //发送消息 bos.write("哈啊哈哈".getBytes()); bos.flush(); byte[] car = new byte[1024]; int len = bis.read(car); System.out.println("从服务器端接收的消息:" + new String(car,0,len)); //从服务器端接收的消息:收到消息了 bis.close(); bos.close(); server.close(); }
    2) UDP

    UDP(UserDatagramProtocol ) 发送短信 非面向连接、不安全、数据可能丢失 、效率高

    ​ DatagramSocket:用于发送或接收数据包

    ​ DatagramPacket:数据容器(封包)

    服务器端:

    ​ ①创建服务器 DatagramSocket类 +指定端口 (定义服务器端的监听端口)

    ​ ②准备接收容器 字节数组 +封装成DatagramPacket数据包 (准备容器接收数据)

    ​ ③接收数据

    ​ ④分析数据

    ​ ⑤释放资源

    客户端:

    ​ ①创建客户端 DatagramSocket类 +指定端口 (定义客户端的监听端口)

    ​ ②准备数据 字节数组

    ​ ③封装成数据包 需要指定包发送的地址+端口 即服务器地与端口 (打包要发送的数据)

    ​ ④发送数据

    ​ ⑤释放资源

    public static void main(String[] args) throws Exception { //接收数据包 制定自己的端口号为8888 DatagramSocket socket = new DatagramSocket(8888); //接受数据的空间 byte[] car = new byte[1024]; //数据容器(封包) 接收的容器 DatagramPacket packet = new DatagramPacket(car, car.length); //接收 socket.receive(packet); //打印接收内容 String str = new String(car, 0, packet.getLength()); System.out.println(str);//哈哈哈哈哈 socket.close(); } public static void main(String[] args) throws Exception { //用于发送数据包 指定自己的端口 DatagramSocket socket = new DatagramSocket(9999); //发送的数据 byte[] data = "哈哈哈哈哈".getBytes(); //数据包 里面存放了发送的数据 发送的地址 端口 DatagramPacket packet = new DatagramPacket(data, 0, data.length, InetAddress.getLocalHost(), 8888); //发送 socket.send(packet); System.out.println("已发送"); socket.close(); }
    Processed: 0.009, SQL: 9