最近一直在用 TTS Server 来听书,这个APP的语音很厉害,可以设置两种不同的声音,分别对应【旁白】和【对话】,听书的时候很有感觉。
在最近的一次听书时发现,它用【双引号“”】来区分【对话】的。
这样,出现了一个问题:书里有很多的名词描述是用【双引号“”】来标记的。
比如下面这一段,第一行用【旁白】和【对话】两种声音来读,听起来十分难受。
武官叫做“指挥使”,一千人为一“军”,武官为“将军”,一万人为“统”。
所以我要把这类的不是【对话功能】的【双引号“”】改成其他的字符,比如:
武官叫做[指挥使],一千人为一[军],武官为[将军],一万人为[统]。
正好初学了一遍正则表达式,就来实操一下。
以下面的文本为例,有点复杂。
大概是些“你好”、“我叫月儿”之类的字句,李森心里嘀咕:“有点不妙啊!”。
武官叫做“指挥使”,一千人为一“军”,武官为“将军”。
“怎么心有点定不住?”洪易定“神”寻思。
说过这句话之后,摆摆手:“去吧。”
通过思考,我用【零宽度断言】的方法,分成几步来实现:
1. 【对话】的结尾都有结束的标点符号,如【。!?…】等,将这类带有结束标点符号的右引号改掉:
正则表达式 负后发断言?<! 匹配:(?<![。!?,—~…])”
替换:】
改完后结果为(通过editplus查找替换):
大概是些“你好】、“我叫月儿】之类的字句,李森心里嘀咕:“有点不妙啊!”。
武官叫做“指挥使】,一千人为一“军】,武官为“将军】。
“怎么心有点定不住?”洪易定“神】寻思。
说过这句话之后,摆摆手:“去吧。”
2. 再将对应的左引号改掉:
正则表达式 正先行断言?= 查找和符号】相匹配的:匹配:“(?=.*】)
替换:【
但是,结果不完美,因为正则表达式贪婪匹配,改完后,第三行有问题:
大概是些【你好】、【我叫月儿】之类的字句,李森心里嘀咕:“有点不妙啊!”。
武官叫做【指挥使】,一千人为一【军】,武官为【将军】。
【怎么心有点定不住?”洪易定【神】寻思。 //这行第一个字符不对
说过这句话之后,摆摆手:“去吧。”
我中间也换了几个思路:
比如用负先行断言?! 只查找【左引号“ 】右边不是对应的【右引号”】
匹配:“(?!.*”)
但这会导致第1行无法匹配。
3. 最好试了好几次,按下面的,把第3行修正过来
正先行断言 ?=匹配:【(?=.*[。!?,—~…]”)(?!.*“)
替换:“注:匹配后面的(?!.*“) 不能去掉,不然第1行又会出问题
这中间修改好几次,最终没有问题了,可以安心听书。
@20221128,其实还有匹配中文字符的方式来快速解决:
第1步:匹配:(?<![。!?,—~…])”
替换:】第2步:匹配:“(?=[\u4E00-\u9FA5]+】)
替换:【