2024.11.20 鲜花
正则表达式
核心共振
⚡超越一切震慑凡人⚡
⚡带来终结机械降神⚡
⚡风暴之力充满全身⚡
⚡最后一击核心共振⚡
就是首先你需要知道一些元字符,也就是它的语法。
最基本的几个:
^
$
分别指定行首和行尾。
[abc]
表示匹配 a,b,c 中的一个,当然长度不限。也有一些符合人类直觉的写法:[a-o]
表示从 a 到 o 的所有小写字母,[1-9]
[A-X]
也都是对的。
[^abc]
表示匹配除了 a,b,c 中的一个,将 ^
放到 []
里相当于取反。
{a}
{a,}
{a,b}
分别表示匹配恰好
.
表示一个任意除回车(\n
和 \r
)字符,在某些时候(如 C 中不指定 REG_NEWLINE
时)也会匹配回车。
()
用于划分单元,将其中的内容作为一个单元匹配,可以用 \x
来引用第 (.)\1
匹配两个相同字符,在 C++ 中查找时会先储存整个的匹配,再将每段分别储存。
|
就是或,两边有一边成立就匹配。
\b
匹配单词和空格的边界,并不匹配字符。
\B
\b
取反。
\f \n \r \t \v
就是字面意思,匹配换页,换行,制表等。
\<
\>
分别匹配词首和词尾,分隔符不一定是空格。
会了上面的基本就会所有了,下面的大多都是上面的的等价简略写法。
?
等价 {0,1}
+
等价 {1,}
\d
等价 [0-9]
\s
匹配不可见,等价 [\f\n\r\t\v]
\w
匹配包括下划线在内的所有单词字符,等价 [0-9A-Za-z_]
\D
\S
\W
上面那仨的取反。
然后想在 C++ 里用正则表达式,还要学一点语法。
考虑一下速度,boost 的功能强大但有非常“优秀”的速度,C++ 的速度在匹配不上时较快,匹配上时飞慢,而且查找也是飞慢,所以这里建议大家用 C 里的 regex.h
,虽然好像只有 linux
能用。
用法就是首先你要引用 <regex.h>
库。
一共两个类型,四个函数:
regex_t
:用来存已经编译好的正则表达式。
int regcomp(regex_t &a,const char *s,int t)
:a
就是用来存的,s
是需要编译的表达式,t
是编译 tag,一共四个,等号后面是它的值:REG_EXTENDED=1
使用更牛的库,一般是要加的,REG_ICASE=2
设置大小写不敏感,REG_NEWLINE
如果不加,默认忽略回车,就会导致 ^
$
只能匹配第一个和最后一个,且 .
能匹配回车,加上了就完全取反,REG_NOSUB
不返回匹配结果,只返回是否成功匹配。
regmatch_t
:用来存匹配结果,.rm_so
表示起点,.rm_eo
是终点加一。
int regexec(regex_t &a,const char *s,size_t x,regmatch_t &c,int t)
:表示用表达式 a
匹配(或者说查找) s
;x
是存储个数,会将正串匹配和 c
,若制定了 REG_NOSUB
会忽略;t
是 tag,一共两种,REG_NOTBOL=1
表示禁用 ^
,REG_NOTEOL=2
表示禁用 $
,若指定了 REG_NEWLINE
会忽略,返回值为
因为 regcomp
分配了内存,所以在每次编译后都要用 void regfree(regex_t &a)
来释放内存。理论上每次重新编译也要先释放,但是实测不释放也能过,不知道会不会有其他问题。
regerror
是在产生错误后返回错误信息,感觉没啥用,可以自行百度。
有个板子:正则表达式
P
本文来自博客园,作者:5k_sync_closer,转载请注明原文链接:https://www.cnblogs.com/xrlong/p/18556515
版权声明:本作品采用 「署名-非商业性使用-相同方式共享 4.0 国际」许可协议(CC BY-NC-SA 4.0) 进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了