0%

正则表达式应用

正则表达式(Regular Expression)是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为”元字符”)。

正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。

这里会介绍正则表达式的相关语法以及常见使用示例

语法

元字符

下表包含了元字符的完整列表以及它们在正则表达式上下文中的行为:

字符 描述
\ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符。例如,’n’ 匹配字符 “n”。’\n’ 匹配一个换行符。序列 ‘\‘ 匹配 “" 而 “(“ 则匹配 “(“。
^ 匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 ‘\n’ 或 ‘\r’ 之后的位置。
$ 匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 ‘\n’ 或 ‘\r’ 之前的位置。
* 匹配前面的子表达式零次或多次。例如,zo* 能匹配 “z” 以及 “zoo”。* 等价于{0,}。
+ 匹配前面的子表达式一次或多次。例如,’zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等价于 {1,}。
? 匹配前面的子表达式零次或一次。例如,”do(es)?” 可以匹配 “do” 或 “does” 。? 等价于 {0,1}。
{n} n 是一个非负整数。匹配确定的 n 次。例如,’o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的两个 o。
{n,} n 是一个非负整数。至少匹配n 次。例如,’o{2,}’ 不能匹配 “Bob” 中的 ‘o’,但能匹配 “foooood” 中的所有 o。’o{1,}’ 等价于 ‘o+’。’o{0,}’ 则等价于 ‘o*’。
{n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,”o{1,3}” 将匹配 “fooooood” 中的前三个 o。’o{0,1}’ 等价于 ‘o?’。请注意在逗号和两个数之间不能有空格。
? 当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 “oooo”,’o+?’ 将匹配单个 “o”,而 ‘o+’ 将匹配所有 ‘o’。
. 匹配除换行符(\n、\r)之外的任何单个字符。要匹配包括 ‘\n’ 在内的任何字符,请使用像”(.|\n)“的模式。
(pattern) 匹配 pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在JScript 中则使用 $0…$9 属性。要匹配圆括号字符,请使用 ‘(‘ 或 ‘)‘。
(?:pattern) 匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 “或” 字符 (|) 来组合一个模式的各个部分是很有用。例如, ‘industr(?:y|ies) 就是一个比 ‘industry|industries’ 更简略的表达式。
(?=pattern) 正向肯定预查(look ahead positive assert),在任何匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,”Windows(?=95|98|NT|2000)”能匹配”Windows2000”中的”Windows”,但不能匹配”Windows3.1”中的”Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。
(?!pattern) 正向否定预查(negative assert),在任何不匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如”Windows(?!95|98|NT|2000)”能匹配”Windows3.1”中的”Windows”,但不能匹配”Windows2000”中的”Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。
(?<=pattern) 反向(look behind)肯定预查,与正向肯定预查类似,只是方向相反。例如,”`(?<=95
(?<!pattern) 反向否定预查,与正向否定预查类似,只是方向相反。例如”`(?<!95
x|y 匹配 x 或 y。例如,’z|food’ 能匹配 “z” 或 “food”。’(z|f)ood’ 则匹配 “zood” 或 “food”。
[xyz] 字符集合。匹配所包含的任意一个字符。例如, ‘[abc]’ 可以匹配 “plain” 中的 ‘a’。
[^xyz] 负值字符集合。匹配未包含的任意字符。例如, ‘[^abc]’ 可以匹配 “plain” 中的’p’、’l’、’i’、’n’。
[a-z] 字符范围。匹配指定范围内的任意字符。例如,’[a-z]’ 可以匹配 ‘a’ 到 ‘z’ 范围内的任意小写字母字符。
[^a-z] 负值字符范围。匹配任何不在指定范围内的任意字符。例如,’[^a-z]’ 可以匹配任何不在 ‘a’ 到 ‘z’ 范围内的任意字符。
\b 匹配一个单词边界,也就是指单词和空格间的位置。例如, ‘er\b’ 可以匹配”never” 中的 ‘er’,但不能匹配 “verb” 中的 ‘er’。
\B 匹配非单词边界。’er\B’ 能匹配 “verb” 中的 ‘er’,但不能匹配 “never” 中的 ‘er’。
\cx 匹配由 x 指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 ‘c’ 字符。
\d 匹配一个数字字符。等价于 [0-9]。
\D 匹配一个非数字字符。等价于 [^0-9]。
\f 匹配一个换页符。等价于 \x0c 和 \cL。
\n 匹配一个换行符。等价于 \x0a 和 \cJ。
\r 匹配一个回车符。等价于 \x0d 和 \cM。
\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
\S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\t 匹配一个制表符。等价于 \x09 和 \cI。
\v 匹配一个垂直制表符。等价于 \x0b 和 \cK。
\w 匹配字母、数字、下划线。等价于’[A-Za-z0-9_]’。
\W 匹配非字母、数字、下划线。等价于 ‘[^A-Za-z0-9_]’。
\xn 匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,’\x41’ 匹配 “A”。’\x041’ 则等价于 ‘\x04’ & “1”。正则表达式中可以使用 ASCII 编码。
\num 匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。例如,’(.)\1’ 匹配两个连续的相同字符。
\n 标识一个八进制转义值或一个向后引用。如果 \n 之前至少 n 个获取的子表达式,则 n 为向后引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。
\nm 标识一个八进制转义值或一个向后引用。如果 \nm 之前至少有 nm 个获得子表达式,则 nm 为向后引用。如果 \nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的向后引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字 (0-7),则 \nm 将匹配八进制转义值 nm。
\nml 如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml。
\un 匹配 n,其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如, \u00A9 匹配版权符号 (?)。

运算符优先级

正则表达式从左到右进行计算,并遵循优先级顺序,这与算术表达式非常类似。

相同优先级的从左到右进行运算,不同优先级的运算先高后低。下表从最高到最低说明了各种正则表达式运算符的优先级顺序:

运算符 描述
\ 转义符
(), (?:), (?=), [] 圆括号和方括号
*, +, ?, {n}, {n,}, {n,m} 限定符
^, $, \任何元字符、任何字符 定位点和序列(即:位置和顺序)
| 替换,”或”操作 字符具有高于替换运算符的优先级,使得”m|food”匹配”m”或”food”。若要匹配”mood”或”food”,请使用括号创建子表达式,从而产生”(m|f)ood”。

定位符

定位符使您能够将正则表达式固定到行首或行尾。它们还使您能够创建这样的正则表达式,这些正则表达式出现在一个单词内、在一个单词的开头或者一个单词的结尾。

定位符用来描述字符串或单词的边界,^$ 分别指字符串的开始与结束,\b 描述单词的前或后边界,\B 表示非单词边界。

正则表达式的定位符有:

字符 描述
^ 匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性,^ 还会与 \n 或 \r 之后的位置匹配。
$ 匹配输入字符串结尾的位置。如果设置了 RegExp 对象的 Multiline 属性,$ 还会与 \n 或 \r 之前的位置匹配。
\b 匹配一个单词边界,即字与空格间的位置。
\B 非单词边界匹配。

选择

用圆括号 () 将所有选择项括起来,相邻的选择项之间用 | 分隔。

() 表示捕获分组,**()** 会把每个分组里的匹配的值保存起来, 多个匹配值可以通过数字 n 来查看(n 是一个数字,表示第 n 个捕获组的内容)。

修饰符

下表列出了正则表达式常用的修饰符:

修饰符 含义 描述
i ignore - 不区分大小写 将匹配设置为不区分大小写,搜索时不区分大小写: A 和 a 没有区别。
g global - 全局匹配 查找所有的匹配项。
m multi line - 多行匹配 使边界字符 ^$ 匹配每一行的开头和结尾,记住是多行,而不是整个字符串的开头和结尾。
s 特殊字符圆点 . 中包含换行符 \n 默认情况下的圆点 . 是匹配除换行符 \n 之外的任何字符,加上 s 修饰符之后, . 中包含换行符 \n。

使用示例

邮箱

手机号

1
2
3
4
5
6
7
/fdfd/{id}

\{[\S]*\}
/fdfd/courage.he@gmail.com/
/fdfd/[a-zA-Z0-9@\-\.#%\$&\+=_]+

/fdfd/courag/
1
2
3
4
5
6
7
8
9
10
11
12
private Pattern preCompile(String url) {
// 如果url没有以/ 结尾,则默认添加/结尾
url = url.endsWith("/") ? url : url.concat("/");
// 替换{..} 的内容
url = url.replaceAll("\\{[^}]*\\}", "[a-zA-Z0-9@\\\\-\\.#%\\$&\\+=_]+");


// 将/ 专业换为\/
url = "^(" + url.replaceAll("/", "\\\\/") + ")$";
return Pattern.compile(url);
}

参考:https://www.runoob.com/regexp/regexp-operator.html

Fetch模拟请求

当有接口需要测试的时候,以前的想法都是采用postman保存URL,并从浏览器中复制cookie进行测试。最近发现了fetch这个工具,可以在浏览器控制台下模拟请求,直接就可以使用浏览器的用户环境,无需构造cookie,请求头等。这个工具对于简单的接口测试还是非常有效率的!

阅读全文 »

Redis知识及应用

排行榜实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#添加一个
zadd money_rank 100 zyf

#为 zyf 这个元素的得分 加上 3
zincrby money_rank 3 zyf

#去处前三名
zrange money_rank 0 3

#列出全部,并显示分数(从低到高)
zrange money_rank 0 -1 withscores

#列出全部,并显示分数(从高到低)
zrevrange WARNING_COUNT_RANK 0 -1 withscores

#查看有多少人
zcard money_rank

#查看 zyf 的排名次序
zrank money_rank zyf

#查看 zyf 的排名次序 (倒序)
zrevrank rank zyf

#移除
zrem money_rank zyf

参考:https://www.jianshu.com/p/834b4e3ba980

第 99 双周赛&第335场周赛

本周同时参加了第99场双周赛和第335场周赛,因此本文将两场比赛的题目一起整理如下!这次竞赛

第 99 场双周赛

双周赛解决了1,2题,第三题超时一直没解决。下次努力!

01.最小和分割

这是参赛时想出来的思路:

  1. num0-9组合,用长度为10的数组存储数字数量,数组索引代表存储的数,值代表个数
  2. 将数组中存储的的的数字从0-9依次分配至builder1builder2
  3. 将两数字串解析为数字相加,即为答案!
阅读全文 »

SQL知识小结

常用函数

不同数据库的函数往往各不相同,因此不可移植。本节主要以 MySQL 的函数为例。

文本处理

函数 说明
LEFT()RIGHT() 左边或者右边的字符
LOWER()UPPER() 转换为小写或者大写
LTRIM()RTIM() 去除左边或者右边的空格
LENGTH() 长度
SOUNDEX() 转换为语音值
阅读全文 »

数据结构之各种树(二叉树、AVL树、红黑树、B、B+树)

二叉查找树

性质:

1、任意节点左子树不为空,则左子树的值均小于根节点的值;
2、任意节点右子树不为空,则右子树的值均大于于根节点的值;
3、任意节点的左右子树也分别是二叉查找树;
4、没有键值相等的节点;

图示:

二叉查找树按照中序遍历即从小到大分布:1,3,4,6,7,8,10,13,14

下载

阅读全文 »

第 98 双周赛&第333场周赛 | 归并排序、动态规划

本周同时参加了第98场双周赛和第333场周赛,因此本文将两场比赛的题目一起整理如下!

第 98 场双周赛

01.替换一个数字后的最大差值

暴力枚举,找出所有可能的最大值、最小值即可得到答案。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Solution01 {
//暴力枚举
public int minMaxDifference(int num) {
String s = String.valueOf(num);
int max = Integer.MIN_VALUE;
int min = Integer.MAX_VALUE;
for(int i = 0;i<10;i++){
//获取最大值
int digitMax = Integer.parseInt(s.replace((char)i,'9'));
max = max>digitMax?max:digitMax;
//获取最小值
int digitMin = Integer.parseInt(s.replace((char)i,'0'));
min = min<digitMin?min:digitMin;
}
return max-min;
}
}
阅读全文 »

计算机网络

常用协议

名称 端口号码 注释
FTP(文件传输协议) 20 数据传输端口
FTP(文件传输协议) 21 控制端口
SSH(Secure Shell) 22
Telnet(远程登陆协议) 23 被SSH所取代
SMTP(简单邮件传输协议) 25 用来发送电子邮件
DNS( 域名系统) 53 域名转换为的 IP 地址(UDP)
TFTP(小文件传输协议) 69 (UDP)
HTTP(超文本传输协议) 80
pop2(邮局协议版本2) 109 负责邮件接收的协议
pop3(邮局协议版本3) 110 负责邮件接收的协议
SFTP(安全文件传输协议) 115
IMAP(互联网消息存取协议) 143 可用于邮件接收
SNMP(简单网络管理协议) 161 (UDP)
HTTPS 443 HTTP+SSL

第328场周赛

01. 数组元素和与数字和的绝对差

简单题,暴力即可。

num%10代表获取该数的个位数字

num/10代表该数缩小10倍,原个位数字抹掉了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Solution01 {
public int differenceOfSum(int[] nums) {
int sum1 = 0;
int sum2 = 0;
for(int i =0;i<nums.length;i++){
sum1+= nums[i];
while(nums[i] !=0 ){
sum2 += nums[i] % 10;
nums[i] = nums[i] / 10;
}
}
return Math.abs(sum1-sum2);
}
}
阅读全文 »

动态规划

将原问题拆解成若干子问题,同时保存子问题的答案,使得每个子问题只求解一次,最终获得原问题的答案。

递归问题》重叠子问题》记忆化搜索(自顶向下的解决问题)/动态规划(自底向上的解决问题)

阅读全文 »