2024.11.20 鮮花
正則表達(dá)式
核心共振
?超越一切震懾凡人?
?帶來終結(jié)機(jī)械降神?
?風(fēng)暴之力充滿全身?
?最后一擊核心共振?
就是首先你需要知道一些元字符,也就是它的語法。
最基本的幾個(gè):
^ $ 分別指定行首和行尾。
[abc] 表示匹配 a,b,c 中的一個(gè),當(dāng)然長(zhǎng)度不限。也有一些符合人類直覺的寫法:[a-o] 表示從 a 到 o 的所有小寫字母,[1-9] [A-X] 也都是對(duì)的。
[^abc] 表示匹配除了 a,b,c 中的一個(gè),將 ^ 放到 [] 里相當(dāng)于取反。
{a} {a,} {a,b} 分別表示匹配恰好 \(a\) 次,至少 \(a\) 次,\([a,b]\) 次。
. 表示一個(gè)任意除回車(\n 和 \r)字符,在某些時(shí)候(如 C 中不指定 REG_NEWLINE 時(shí))也會(huì)匹配回車。
() 用于劃分單元,將其中的內(nèi)容作為一個(gè)單元匹配,可以用 \x 來引用第 \(x\) 段以獲取的匹配,如 (.)\1 匹配兩個(gè)相同字符,在 C++ 中查找時(shí)會(huì)先儲(chǔ)存整個(gè)的匹配,再將每段分別儲(chǔ)存。
| 就是或,兩邊有一邊成立就匹配。
\b 匹配單詞和空格的邊界,并不匹配字符。
\B \b 取反。
\f \n \r \t \v 就是字面意思,匹配換頁,換行,制表等。
\< \> 分別匹配詞首和詞尾,分隔符不一定是空格。
會(huì)了上面的基本就會(huì)所有了,下面的大多都是上面的的等價(jià)簡(jiǎn)略寫法。
? 等價(jià) {0,1}
+ 等價(jià) {1,}
\d 等價(jià) [0-9]
\s 匹配不可見,等價(jià) [\f\n\r\t\v]
\w 匹配包括下劃線在內(nèi)的所有單詞字符,等價(jià) [0-9A-Za-z_]
\D \S \W 上面那仨的取反。
然后想在 C++ 里用正則表達(dá)式,還要學(xué)一點(diǎn)語法。
考慮一下速度,boost 的功能強(qiáng)大但有非?!皟?yōu)秀”的速度,C++ 的速度在匹配不上時(shí)較快,匹配上時(shí)飛慢,而且查找也是飛慢,所以這里建議大家用 C 里的 regex.h,雖然好像只有 linux 能用。
用法就是首先你要引用 <regex.h> 庫(kù)。
一共兩個(gè)類型,四個(gè)函數(shù):
regex_t:用來存已經(jīng)編譯好的正則表達(dá)式。
int regcomp(regex_t &a,const char *s,int t):a 就是用來存的,s 是需要編譯的表達(dá)式,t 是編譯 tag,一共四個(gè),等號(hào)后面是它的值:REG_EXTENDED=1 使用更牛的庫(kù),一般是要加的,REG_ICASE=2 設(shè)置大小寫不敏感,REG_NEWLINE 如果不加,默認(rèn)忽略回車,就會(huì)導(dǎo)致 ^ $ 只能匹配第一個(gè)和最后一個(gè),且 . 能匹配回車,加上了就完全取反,REG_NOSUB 不返回匹配結(jié)果,只返回是否成功匹配。
regmatch_t:用來存匹配結(jié)果,.rm_so 表示起點(diǎn),.rm_eo 是終點(diǎn)加一。
int regexec(regex_t &a,const char *s,size_t x,regmatch_t &c,int t):表示用表達(dá)式 a 匹配(或者說查找) s;x 是存儲(chǔ)個(gè)數(shù),會(huì)將正串匹配和 \(x-1\) 前個(gè)單元的匹配放到 c,若制定了 REG_NOSUB 會(huì)忽略;t 是 tag,一共兩種,REG_NOTBOL=1 表示禁用 ^,REG_NOTEOL=2 表示禁用 $,若指定了 REG_NEWLINE 會(huì)忽略,返回值為 \(0\) 表示找到了,為其他表示沒找到或出現(xiàn)錯(cuò)誤;每次只能匹配第一個(gè),要匹配所有的話寫循環(huán)每次位移即可。
因?yàn)?regcomp 分配了內(nèi)存,所以在每次編譯后都要用 void regfree(regex_t &a) 來釋放內(nèi)存。理論上每次重新編譯也要先釋放,但是實(shí)測(cè)不釋放也能過,不知道會(huì)不會(huì)有其他問題。
regerror 是在產(chǎn)生錯(cuò)誤后返回錯(cuò)誤信息,感覺沒啥用,可以自行百度。
有個(gè)板子:正則表達(dá)式
P


本文來自博客園,作者:xrlong,轉(zhuǎn)載請(qǐng)注明原文鏈接:http://www.rzrgm.cn/xrlong/p/18556515
版權(quán)聲明:本作品采用 「署名-非商業(yè)性使用-相同方式共享 4.0 國(guó)際」許可協(xié)議(CC BY-NC-SA 4.0) 進(jìn)行許可。

浙公網(wǎng)安備 33010602011771號(hào)