技术问询:用正则表达式替换单行中第三次及以后的重复字符串
文本转语音工具的重复内容正则处理方案
需求说明
给文本转语音(TTS)工具编写正则表达式,解决它处理重复内容的问题:当文本里出现拖长发音(比如AAAAAAAAARRRRRRGGHHHH!!!!、XXXXXXXXXXXXXXXX这类)或重复单词时,人工阅读无影响,但TTS工具会在无法正常发音时逐个读出每个字母。
该TTS工具支持通过正则调整发音,普通查找替换无法满足需求,我们需要实现:匹配任意重复3次及以上的字符串,但仅选中(并替换)第三次及之后的重复实例。
个人尝试的正则
我自己写出的正则为:(?|(?'a'.*)\k'a'(\1))\1,但这个正则只能匹配部分测试用例。
测试文本
The quick brown fox jumps over the lazy lazy lazy dog. The quick brown fox jumps over the lazy lazy dog. Attack Attack Attack Attack Attack Attack Attack Attack Attack!!!!!! Attack!! WAAAAAAGGGGGGHHHHHH!!! WAAGGHH!! Attack Whatever Attack Attack Attack Whatever Attack Attack The quick brown fox jumps over the lazy lazy lazy dog. The quick brown fox jumps over the lazy lazy dog. Attack Attack Attack Attack Attack!! Attack!! WAAGGHH!!! WAAGGHH!! Attack Whatever Attack Attack Attack Whatever Attack Attack This This This Friend Friend Friend This This Friend Friend
适配问题说明
之前找到的两个正则方案在测试环境能正常运行,但在@voice工具里无法生效,目前正在确认该工具使用的正则变体:
- 方案1:仅移除所有匹配文本,不符合需求
- 方案2:报错信息为「Unrecognized backslash escape sequence near index 16」
可行解决方案
查找正则
(.+?) *\1( *\1)+
替换内容
$1$2
此前未注意到需要搭配替换规则,添加后即可正常生效。
内容的提问来源于stack exchange,提问作者Ranakastrasz
相关产品推荐
相关产品推荐

