正则表达式
引言
从前我们学习了KMP算法文本匹配,但是现在我们的这个正则表达式,提供一种单独的语法解决,但是KMP算法仍有很多局限且消耗算力,为了解决网络中的大量匹配问题,引入伟大的正则表达式,用于匹配与替换。
编程语言中我们使用的转义字符等有一定出处,正则表达式最初来自我们的unix机器
简单的语法
纯文本匹配
直接匹配文本,区分大小写,通常只返回第一个,可以编程语言中选择返回所有的数组。
**.号**匹配
. 可以指代包括.在内的所有符号 匹配本身时引入了伟大的转义符号 \
匹配想要中的字符
使用[],[]中的只要满足一个就算是匹配 常常用在不区分大小写的表示 [Cc][Aa][Tt].eg 事实上我们的markdown都有转义字符
取非匹配
- 使用元字符^ 且作用于集合 注意是在集合的内部 求非 代表一个[^]因为具有多义性
元字符匹配
使用转义字符匹配
[] - ^ \ . +
特殊的元字符
- \f 换页符 \n换行符 \r回车符 \t制表符 \v垂直制表符 [\b]backspace
- 举个例子 处理 CSV文件 , 变成空格
- windows 中 \r\n 表示换行 linux \r可选 \n 必选
对集合的简化
- \d 所有的数字=[0-9] \D=[^0-9]
- \w 所有字母大小写与数字 \W 所有的非
- \s 任何一个空字符 \f\n\r\v\t \S
- 十六进制与八进制 \0x \0 \c 控制字符
- POSIX字符的支持 格式[: 英文描述:]
重复匹配
- 元字符 [0-9]+ 0-9中的数字的一个以上 不能0个
- 举个例子 关于邮箱地址的匹配
- \w@\w\.\w 升级
- \w+@\w+\.\w+
- 升级\[\w.]+@\[\w\.]+\.[\w.]+ 注意这个例子可以看出我们的在[]里所有的元字符都可以看作是普通字符 但是转义了也没有错误
*元字符
- 可以匹配0次与任意次 相当于 + 的升级版
- \w+[\w.]*@[\w.]+\.\w+ 可以把* 看作可选项 实质理解
?元字符
- 匹配一次或零次 http:// 与 https:// 不能用s* httpsss 所以使用?
- [\r]? 与我们的\r? 本质是一样的 但是为了清晰直观 我们通常直接[\r]
匹配次数
- {}也是元字符 举个例子就是之前的RGB #[0-9A-Fa-f]写六遍可以使用{6}
- 也可以设置一个区间{2.4}
- []中间是的元字符都是为普通字符,最好写一个\
- 匹配至少多少次 {3,}类似python
防止过度匹配
使用懒惰版本,进行匹配,前面的匹配都是一个贪婪匹配,例如 * + {n,} 对应的懒惰版本就是加上一个? 例如 * 与 *? 还有 + +? {n,} {n,}?
这里的懒惰可以理解成就是 尽量的再匹配到第一个的时候就停下来 ,而贪婪就是匹配到最后一个再停下来
位置匹配
- 指定匹配发生的位置
- \b 一个标记,用来标记一个单词的开头或者是结尾 理解\b 的实质,实质就是匹配一个可以\w 与一个非字母或者是数字的位置\W 之间的一个位置 b代表boundary 注意我们的这个 \b 只是匹配一个位置 ,而不是匹配一个字符 所以 \bcat\b 得到的字符 还是 3个字符 而非5个
- 同理 的 \B 来匹配一个你想要的边界 就是 eg night-color \B-\B 可以匹配 但是我们的 color - color 就是无法匹配
- ^ 这里来再次出现 用作 标记字符串的开始位置 $ 用于标记字符串的结尾
- 举个例子 匹配一个 XML 文件 因为必须要求 这个声明位于一个文档的最开始 所以我们需要进行 字符串的一个声明 例如 这个 ^\s*<?xml.*?>
- Post title:正则表达式
- Post author:Winter
- Create time:2023-03-25 20:37:20
- Post link:https://spikeihg.github.io/2023/03/25/正则表达式/
- Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.