开源阅读替换教程&正则替换五步走(下)


五、精简——精简通用规则
分支选择——方括号[]和竖线|的使用
如在上个教程的示例④中
原文:(多谢/感谢)书友xx的(鲜花/打赏/刀片)
替换规则:[感多]谢.*(鲜花|打赏|刀片)
这里开头包含“多谢”“感谢”2种情况,结尾包含“鲜花”“打赏”“刀片”3种情况,排列组合后则共有6种情况,如果我们对这6种情况原模原样替换的话,就需要6种情况写6条规则,这显然是不划算的。
这时,用“[多感]谢”表示“多”“感”任选其一与谢组合,就把“感谢”与“多谢”这两种情况合二为一,大大简化了规则篇幅;用“鲜花|打赏|刀片”
表示“鲜花”“打赏”“刀片”三者任选其一,也是同样的效果。
看到这里,你也许会产生两个疑问:
为什么一个用中括号[]一个用竖线|❓
竖线|的内容为什么要加括号()❓
解答第一个问题需要我们明白中括号[]与竖线|的区别:中括号[]是任选其中之一,必须且只能选择其中一个字符,两个以上字符的情况则只能用竖线|表示,当然竖线|也适用一个字符。
解答第二个问题需要我们明白正则匹配时的优先级:我们用数学里面的四则运算来类比。一般的正则可以看作加减法,优先级是从左到右,即一般的正则是从左到右依次生效的;如果遇到乘除法或者括号,则需要遵循“从左到右,从内到外”的顺序,这里的括号()和竖线|就是如此,如果规则写成“[感多]谢.*鲜花|打赏|刀片”,就变成了“[感多]谢.*鲜花”“打赏”“刀片”三者任选其一,用“(鲜花|打赏|刀片)”则先在“鲜花”“打赏”“刀片”三者任选其一,再与“[感多]谢.*”组合。
此外,示例①匹配网址中的“[::]”就包含了中英文两种冒号的情况,后面的“[a-z\.\d\/\?#]+”则列举了网址中常出现的数字、字母、点、斜线等字符,保证出现这些字符的网址都能匹配到。其他示例也是类似。
那么中括号[]能否和竖线|组合使用呢?当然是可以的。例如我们将示例④改为
原文:(多谢/感谢)书友xx的(投票/月票/推荐票)
替换规则:[多感]谢.*([投月]|推荐)票
也可写成:[感多]谢.*(投|月|推荐)票