常用正则表达式总结
正则表达式语法
字符
说明
^
匹配字符输入的开始
$
匹配字符输入的结束
\d
数字字符, 等效于[0-9]
\s
匹配任何空白字符,包括空格、制表符、换页符等
\S
匹配任何非空白字符
{n}
正好匹配n次
{n,}
至少匹配n次
{n, m}
n<=m, 匹配至少n次,至多m次
()
标记一个子表达式的开始和结束位置。子表达式可以供以后使用
*
零次或多次匹配前面的字符或子表达式, 等效于{0,}
+
一次或多次匹配前面的字符或子表达式,等效于{1,}
?
零次或一次匹配前面的字符或子表达式,等效于 {0,1}
.
匹配除”\r\n”之外的任何单个字符
|
或的关系
\un
匹配 n,其中 n 是以四位十六进制数表示的 Unicode 字符。例如,\u00A9 匹配版权符号 (©)。
\w
匹配任何字类字符,包括下划线。与”[A-Za-z0-9_]”等效
[\u4e00-\u9fa5]
匹配中文字符
常见示例以Java写法为例, 其他语言类似:
123456789101112131415 ...
还是阳了
还是记录一下为好。时间是2023年5月17号, 我终于还是阳了。
5月17号早上起来的时候, 就感觉头很疼,还以为是昨天晚上吹空调导致的,但是后来越来越疼,于是买了个体温计和检测试剂,不出所所料,确实阳了,当时的体温是38.9度。
前后总共持续4天左右, 除了头疼和发烧, 其他的症状到还好, 但是这个头疼真的很难受,是既不能睡又不能不睡。
之前疫情三年一直都没阳过, 包括最后解封的时候, 我周边的同事都阳了, 就只有我没阳, 还以为自己体质很好(其实我的体质确实感觉还行, 已经有七八年没去过医院,吃过药了,最近的一次生病我记的应该是高中的时候吃东西吃坏肚子)。
但最终还是没躲过去。
红米AC2100 openwrt下无法进入breed
最近ac2100刷的openwrt,想换回pandavan,使用如下方法无法进入breed的web页面:
先断电,然后找个针戳住路由器背后 Reset 小孔并插电,等路由器蓝灯一直闪烁后,浏览器输入 192.168.1.1,即可进入 breed 网页。
路由器的system一直闪黄灯,突然想到之前刷openwrt的时候, 刷入了官方的bootloader, 所以自然无法进入。下面介绍一下在openwrt的系统下,如何刷breed的bootloader。
在openwrt的web页面,将breed的固件breed-mt7621-xiaomi-r3g.bin上传到/tmp路径下(其他路径也可以),然后ssh进入路由器命令行, 执行 如下命令:
12cd /tmpmtd_write -r write breed-mt7621-xiaomi-r3g.bin Bootloader
之后重启路由器, 登录192.168.1.1就ok了。
有一个注意点,openwrt下ssh的用户名和密码, 网上找了半天都没找到, 所以一直无法登录,后来发现我装的这个openwrt上面已经集成了ss ...
从alpine编译nginx的docker镜像
因为需要接入nginx监控,用的是vts模块,原生nginx并没有包含该模块,原本想着用别人已经编译好的, 但是一想后期可能还需要加入其他的模块,所以还是自己编译一个。
下面说一下具体的步骤。
编写dockerfile文件此处用的几个主要软件版本:
alpine: 3.17
nginx: 1.22.1
nginx-module-vts: 0.2.1
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748FROM alpine:3.17ENV NGINX_VERSION nginx-1.22.1RUN echo https://mirrors.aliyun.com/alpine/v3.17/main/ > /etc/apk/repositories && \ echo https://mirrors.aliyun.com/alpine/v3.17/community/ >> /etc/apk/repositoriesRUN ...
【算法题】字符串相加与相乘
因为在相加或相乘的时候,可能会出现值溢出,所以直接相加或相乘肯定是不行的, 需要另想办法。
这两道题都是模拟摆竖式进行加法与乘法, 但是有一些细节点在写的时候需要注意。
字符串相加https://leetcode.cn/problems/add-strings
给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
解题关键点:
模拟竖式相加,并且使用双指针,指针的移动方向从尾部向头部p1--
num1和num2的长度可能不相等,所以会出现p1或p2小于0的情况,需要单独处理
有可能头部元素相加的时候大于10, 所以需要在循环外单独判断进位数
在获取每一位的int数值时, 将其与’0’这个char相减, 省去了强转, 更加简洁
最后得到的结果是反的, 需要反转一下
下面是完整代码:
12345678910111213141516171819202122232425262728 public String add(String num1, String num2) { int p1 = ...
【算法题】反转链表
原题链接:https://leetcode.cn/problems/reverse-linked-list
本题有两种解法。
双指针其本质就是将当前节点的下一个节点由之前的next改为pre,这样就能完成当前节点的反转, 如此一直往后遍历链表, 并不断重复这个过程。由于在反转的过程中会造成链表的断开, 所以需要一个临时变量来保存。
1234567891011121314151617181920public ListNode reverseList(ListNode head) { // 当前节点的上一个节点, 初始化的时候头结点的上一个节点不存在,所以为null ListNode pre = null; // 当前节点 ListNode cur = head; // 当遍历到最后一个节点的时候,cur指向了null,此时遍历结束 while (cur != null){ // 临时保存一下当前节点的next节点 ListNode tmp = cur.next; // ...
【算法题】合并两个有序链表
原题链接:https://leetcode.cn/problems/merge-two-sorted-lists/
解题要点:
使用一个虚拟节点指向刚开始处(因为此时并不知道新链表的头节点在哪儿)
构造一个pre节点,用来构造新的链表。在遍历两个链表的时候,发现哪个链表节点值较小,就将pre节点的next指向该链表节点,同时将该链表往前移动一步。在每次比较完值之后, 将pre也往前移动一步,这样新的链表节点也就在不断的产生了
在遍历结束之后,可能会存在某个链表还没有遍历完,此时直接将其链接到pre即可
12345678910111213141516171819202122232425public ListNode mergeTwoLists(ListNode list1, ListNode list2) { // 虚拟节点, next指针为null, 因为此时不知道list1和list2的头结点谁更小 ListNode virtual = new ListNode(-1, null); ListNode pre = v ...
hexo主题使用css添加网格背景
给hexo的博客添加一个网格背景, 此处不想使用图片, 而是直接使用css来实现,效果图如下:
css文件内容如下(文件名background.css):
12345body { background:white; background-image:linear-gradient(90deg,rgba(241,243,244,1) 10%,transparent 0),linear-gradient(rgba(241,243,244,1) 10%,transparent 0); background-size:15px 15px;}
为了各个hexo主题都能通用, 此处使用hexo提供的注入功能将css注入到博客中。
在博客根目录下新建一个scripts文件夹, 然后在该文件下新建一个js文件(命名随便都行),复制如下代码:
1hexo.extend.injector.register('head_end','<link rel="stylesheet" type="text/css&quo ...
live555搭建流视频服务播放视频文件
为了方便,使用docker搭建,用的是docker hub上使用人数最多的一个镜像, docker-compose.yml文件内容如下所示:
12345678910version: "3"services: live555: image: vimagick/live555 container_name: live555 restart: always ports: - 554:554 volumes: - ${PWD}/data:/data
视频文件放在当前目录的data文件夹下, 然后使用vlc播放rtsp流地址测试一下, rtsp地址:
1rtsp://ip:554/demo.264
JVM内存分配机制介绍
本文针对的是hotspot虚拟机, jdk版本1.8的虚拟机进行介绍。
程序计数器线程私有,可以看做是当前线程所执行的字节码的行号,用于下一次线程切换的时候虚拟机定位到上一次执行的位置。
虚拟机栈在一个时间点,只会有一个活动的栈帧,通常叫作当前帧,方法所在的类叫作当前类。
如果在该方法中调用了其他方法,对应的新的栈帧会被创建出来,成为新的当前帧,一直到它返回结果或者执行结束。JVM直接对Java栈的操作只有两个,就是对栈帧的压栈和出栈。
总结几点如下:
线程私有,生命周期与线程相同。描述的是方法执行的内存模型。
进入方法时对应入栈,方法结束的时候对应出栈。
该区域存储着局部变量,操作数,方法出口等信息。
方法区
线程共享。用于存储类信息、常量池、静态变量、JIT编译后的代码等数据。具体放在哪里,不同的实现可以放在不同的地方。
一般情况可以理解成class文件在内存中的存放位置。
在1.7和1.8之后的实现逻辑有所不同。
由于该区域大小一般较小,所以不会对该区域进行垃圾回收。所以在1.7之前的版本,有可能会因为字符串常量池过大导致该区域内存溢出(Permgen space ...