总文档 :文章目录
Github : github.com/black-ant
一 . Get Start
正则测试网站 : regex101.com/
二 . 知识点
2.1 标识符
2.1.1 开始结束
1 | java复制代码^ 表示开始 |
2.1.2 元字符符号
符号 | 含义 | 补充 | |
---|---|---|---|
\d | 配置一个数字字符 | [0~9] digit | |
\D | 匹配一个非数字字符 | ||
\w | 匹配一个单词字符 | word | |
\W | 匹配一个非单词字符 | ||
\s | 匹配一个空格 | space | |
\S | 匹配一个非空格 | ||
. | 匹配换行符以外的任意字符 | ||
[^x] | 匹配除了x 以外的任意字符 | ||
[first -last ] |
与从 first 到 last 的范围中的任意单个字符匹配 | [A-Z] | |
[abc] | 匹配 其中的任何单个字符 | ||
\p{name} | 与 name 指定的 Unicode 通用类别或命名块中的任何单个字符匹配 | ||
\P{name} | 与不在 name 指定的 Unicode 通用类别或命名块中的任何单个字符匹配 |
2.1.3 定位字符
符号 | 含义 | 补充 | |
---|---|---|---|
^ | 匹配字符串的开始 | ||
$ | 匹配字符串的结束 | ||
\A | 匹配必须出现在字符串的开头 | ||
\Z | 匹配必须出现在字符串的末尾或出现在字符串末尾的 \n 之前。 |
||
\b | 配置单词的开始或者结束 | ||
\B | 配置不是单词开头或者结束的位置 | ||
\G | 上一个匹配结束的地方 | ||
\z | 匹配必须出现在字符串的末尾 | -\d{3}\z | -901-333”中的 “-333 |
\A | 匹配必须出现在字符串的开头 | \A\d{3} | 901-333-“中的 “901 |
2.1.4 量词符号
符号 | 作用 | 补充 |
---|---|---|
+ | 表示前面字符的一次或多处出现 | 1 ~ n / 前面字符 |
* | 表示前面字符的零次或者多次出现 | 0 ~ n |
? | 表示前面字符可能出现 , 也可能不出现 | 0 ~ 1 |
{m,n} | 表示出现次数从 m 到 n | m <= x <= n |
{m} | 表示一定且必须出现三次 | x = m |
{m , } | 表示至少出现 m 次 | m <= x |
{0 , } | 至少出现 0 次 | 无意义 |
{0 , 1} | 出现 0 次 或者 1 次 | |
() | 分组 ,将多种规则进行分组表示 | 见后文详细介绍 |
2.1.5 其他符号
符号 | 作用 | 补充 |
---|---|---|
[] | 多选 , 表示匹配其中的一个字符 | 类似于or 概念 |
() | 分组 | 详情可看后文 |
2.2 使用方式
2.2.1 分组
1 | java复制代码// 使用方式 |
2.2.2 分组的演示
1 | java复制代码// 案例一 : group 在没有量词匹配时 , 不具有含义 |
2.2.3 分组引用
1 | java复制代码// 引用是需要配合分组共同使用的 , 再次说明分组的规则 |
类型 | 特殊语法 | 说明 exp : 需要处理的文本 |
---|---|---|
正常分组 | (exp) | 捕获括号中的值,并且自动命名 |
非捕获分组 | ( ?: exp ) | 匹配exp , 但是不捕获文本,也不分配组号 |
捕获并且命名 | (?<name >subexpression ) (?’name ‘subexpression ) |
匹配exp,并捕获文本到名称为name的组里,也可以写成(?’name’exp) |
平衡组 | (?<name1 -name2 >subexpression )(?’name1 -name2 ‘subexpression ) |
|
原子分组 | ( ?> exp ) | 原子分组是贪婪的匹配,当文本和这个分组匹配的成功后正则表达式引擎在匹配后面的表达式时不会发生回溯行为及尽可能多的匹配 |
正前向查找分组零宽度正预测先行断言 | ( ?= exp ) | 在正前向分组里面的表达式匹配成功后正则表达式引擎回溯到正前向分组开始匹配的字符处再进行后面正则表达式的匹配如果后面的正则表达式也匹配成功,整个匹配过程才算成功 |
负前向查找分组零宽度负预测先行断言 | ( ?! exp ) | 这种分组功能和正前向查找分组一样唯一的不同就是当前向查找分组里面的正则表达式匹配失败的时候才继续后面的匹配过程 |
正后向查找分组零宽度正回顾后发断言 | ( ? <= exp ) | 可以理解成在正后向查找分组前面的正则表达式匹配成功后正则表达式引擎从最后的位置往字符串左边进行回溯然后和(?<=regex)进行匹配如果匹配失败则整个匹配过程失败;如果匹配成功,则将指针移动到正后向查找分组开始进行匹配的位置继续进行后面正则表达式的匹配过程 |
负后向查找分组零宽度负回顾后发断言 | ( ? < ! exp ) | 这种分组功能和正负向查找分组一样唯一的不同就是当负后向查找分组里面的正则表达式匹配失败的时候才继续后面的匹配过程 |
(#comment) | 文本注释 |
1 | java复制代码// 查找断言 : 基于断言在断言前面或者后面匹配 |
2.2.5 反向引用
表达式 | 作用 | 案例 |
---|---|---|
\ number |
匹配Group 编号 | (\w)\1 |
\k | 命名后向引用。 匹配命名表达式的值 | (?\w)\k |
1 | 复制代码 |
2.2.6 贪婪 懒惰
1 | java复制代码// 贪婪的主要表现形式是 ? |
标识 | 作用 |
---|---|
*? | 重复任意次,但是尽可能少 |
+? | 重复一次或者更多次,尽可能少 |
?? | 重复 0 -1 次 ,尽可能少 |
{n,m}? | 重复 n 到 m 次 ,尽可能少 |
{n,}? | 重复 n 次以上,尽可能少 |
1 | java复制代码// 注意事项 : |
2.2.7 转义
1 | java复制代码\\ : 用于字符转义 |
2.2.8 替代
1 | java复制代码// 使用 : $num -> Group Num |
符号 | 含义 | 补充 |
---|---|---|
$num | 通过组编号替换 | |
$name | 通过 group Name 匹配替换 | |
2.2.9 注释
1 | java复制代码// 注释的方式 |
2.2.10 正则表达式选项值
1 | java复制代码TODO : 感觉没有使用场景 , 暂时不录入 |
三 . 使用
3.2 常规写法
1 | java复制代码 |
3.2 Java 中的用法
1 | java复制代码> Pattern 对象 : 一个正则表达式可以定义为一个 Pattern 对象 |
3.3 Group 语法
1 | java复制代码public int groupCount( )返回matcher对象中的group的数目。不包括group0。 |
3.4 其他
1 | java复制代码start( ) : 返回此次匹配的开始位置 |
3.5 切分
1 | java复制代码// 将以正则表达式为界,将字符串分割成String数组。 |
3.6 替换
1 | java复制代码replaceFirst(String replacement)将字符串里,第一个与模式相匹配的子串替换成replacement。 |
3.7 查询和匹配
1 | java复制代码find() : 尝试在目标字符串里查找下一个匹配子串。 |
四 . 源码梳理
1 | java复制代码TODO |
附录
1 | java复制代码文档参考 : |
基础案例
1 | java复制代码// . 用于匹配任何字符 -- a.f |
数字匹配
1 | java复制代码1 数字: |
国内邮政编码
1 | java复制代码/^[0-9]{6}$/.test(100000) |
匹配指定开头结尾得字符串
1 | java复制代码-> 匹配网址 |
字符匹配
1 | java复制代码1. 汉字:^[\u4e00-\u9fa5]{0,}$ |
特殊需求表达式
1 | java复制代码1. Email地址:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$ |
附录 : 思维导图
本文转载自: 掘金