開源閱讀替換教程&正則替換五步走(下)


五、精簡——精簡通用規(guī)則
分支選擇——方括號(hào)[]和豎線|的使用
如在上個(gè)教程的示例④中
原文:(多謝/感謝)書友xx的(鮮花/打賞/刀片)
替換規(guī)則:[感多]謝.*(鮮花|打賞|刀片)
? ? ? 這里開頭包含“多謝”“感謝”2種情況,結(jié)尾包含“鮮花”“打賞”“刀片”3種情況,排列組合后則共有6種情況,如果我們對(duì)這6種情況原模原樣替換的話,就需要6種情況寫6條規(guī)則,這顯然是不劃算的。
? ? ? ?這時(shí),用“[多感]謝”表示“多”“感”任選其一與謝組合,就把“感謝”與“多謝”這兩種情況合二為一,大大簡化了規(guī)則篇幅;用“鮮花|打賞|刀片”
表示“鮮花”“打賞”“刀片”三者任選其一,也是同樣的效果。
? ? ? ?看到這里,你也許會(huì)產(chǎn)生兩個(gè)疑問:
? ? ? ?為什么一個(gè)用中括號(hào)[]一個(gè)用豎線|?
? ? ? ?豎線|的內(nèi)容為什么要加括號(hào)()?
? ? ? ?解答第一個(gè)問題需要我們明白中括號(hào)[]與豎線|的區(qū)別:中括號(hào)[]是任選其中之一,必須且只能選擇其中一個(gè)字符,兩個(gè)以上字符的情況則只能用豎線|表示,當(dāng)然豎線|也適用一個(gè)字符。
? ? ? ?解答第二個(gè)問題需要我們明白正則匹配時(shí)的優(yōu)先級(jí):我們用數(shù)學(xué)里面的四則運(yùn)算來類比。一般的正則可以看作加減法,優(yōu)先級(jí)是從左到右,即一般的正則是從左到右依次生效的;如果遇到乘除法或者括號(hào),則需要遵循“從左到右,從內(nèi)到外”的順序,這里的括號(hào)()和豎線|就是如此,如果規(guī)則寫成“[感多]謝.*鮮花|打賞|刀片”,就變成了“[感多]謝.*鮮花”“打賞”“刀片”三者任選其一,用“(鮮花|打賞|刀片)”則先在“鮮花”“打賞”“刀片”三者任選其一,再與“[感多]謝.*”組合。
? ? ?此外,示例①匹配網(wǎng)址中的“[::]”就包含了中英文兩種冒號(hào)的情況,后面的“[a-z\.\d\/\?#]+”則列舉了網(wǎng)址中常出現(xiàn)的數(shù)字、字母、點(diǎn)、斜線等字符,保證出現(xiàn)這些字符的網(wǎng)址都能匹配到。其他示例也是類似。
? ? ?那么中括號(hào)[]能否和豎線|組合使用呢?當(dāng)然是可以的。例如我們將示例④改為
原文:(多謝/感謝)書友xx的(投票/月票/推薦票)
替換規(guī)則:[多感]謝.*([投月]|推薦)票
也可寫成:[感多]謝.*(投|月|推薦)票