1.有啥用?

match
文本格式校验
find
在文本中找出 格式匹配的片段
replace
在文本中找出 格式匹配的片段,再用其它片段替换它

2.啥规律?

字符分类
字符可分为数字、字母、位置...
文本长度
文本由几个这样的字符构成

1.大类

\d
数字
\D
非数字
\w
字母、数字、下划线
\W
非(字母、数字、下划线)
.
任意字符

2.枚举

子集
[1-6]部分数字
并集
[a-zA-Z]小写字母和大写字母
补集
[^d-w]其它字母

3.位置

^
文本的开始
$
文本的结束
(?=exp)
exp前面的位置
(?!exp)
!exp前面的位置
(?<=exp)
exp后面的位置
(?
!exp后面的位置
\r
回车符
\n
换行符
\f
换页符
\t
制表符
\s
空白(空格符、制表符、换页符)
\S
非空白
\b
字边界(字和空格之间的位置)
\B
非字边界(字和空格之间的位置)

4.转义

被语法征用了
如果要使用原意,前面要加 \
^ $ ( ) { } ? + * | . [ \

1.常规

{n}
n位
{n,}
n位 及以上
{n, m}
n-m位

2.简化

?
0或1 位
+
1位 及以上
*
任意位数

1.基本单元

字符+长度(缺省为1)
如 \d+ 代表多个数字

2.加限定符(解决歧义)

歧义
假设文本中有3个数字, \d+到底匹配几个?
贪婪(默认): 个数最多的
?
懒惰: 个数最少的
+
独占: 个数最多的,如果匹配不上就拉倒

3.加备选规则

|
如 exp1|exp2, exp1匹配不上,就用exp2尝试

4.分组(捕获)

( )
如 (exp1|exp2)+, 把exp1|exp2当成基本单元
(?<组名>)
如 (?exp1|exp2), 可以给分组(exp1|exp2)起个名字branch
副作用
分组匹配的内容,内被自动捕获、并存储在该组里
(?:exp)
如果不想捕获,就用 ?: 修饰

5.不相邻的重复

\k<组名>
如 (?exp1|exp2)\s\k, 通过\k表达空格后的内容与它相同

1.参考:https://deerchao.cn/tutorials/regex/regex.htm
2.参考:https://www.runoob.com/w3cnote/java-capture-group.html