Chrome扩展开发:如何替换Google Docs中*包裹的文本?
如何用Google Docs API准确替换文档中*包裹的语音识别文本?
问题背景
我正在开发一款Chrome扩展,功能是把语音转文本的内容写入Google文档。用的语音识别API会返回两种结果:一种是快速返回但准确度低的临时文本,另一种是慢一点但准确度高的最终文本。现在的逻辑是先把临时文本写入文档,之后用最终文本替换掉它。
之前的尝试和问题
一开始我把临时文本存在buffMyText缓冲区里,用replaceAllText请求替换,但偶尔会出现缓冲区内容和文档里实际写入的内容对不上(比如有随机无效内容),导致替换失败。代码是这样的:
const requests = [ { replaceAllText: { replaceText: recivedMyText + ' ', containsText: { text: buffMyText, }, }, }, ];
后来改成给临时文本加包裹,想用正则替换之间的内容。第一次写的正则是const regex = '\\*(.*?)\\*';,虽然在RegExr里测试没问题,但用到Google Docs API里不管用。之后换了@sln给的正则'([\S\s]*?)(?=\*)',还是没解决准确替换的问题。对应的请求代码:
// 第一次正则尝试的请求 const requests = [ { replaceAllText: { replaceText: recivedMyText + '', containsText: { matchCase: true, text: regex, wildcardRegex: true, }, }, }, ]; // @sln版本的请求 const requests = [ { replaceAllText: { replaceText: recivedMyText, containsText: { matchCase: true, text: '([\S\s]*?)(?=\*)', // prettier-ignore wildcardRegex: true, }, }, }, ];
解决方法
先搞懂Google Docs API的正则规则
Google Docs API的wildcardRegex不是完全支持标准正则语法,它的规则更简单:
.*匹配任意字符序列(包括换行)?匹配任意单个字符- 要匹配实际的
*字符,得转成\*(因为API里*本身是通配符)
之前用的标准正则语法在API里不生效,得改成适配它的写法。
正确的替换请求写法
单段临时文本的替换
如果每次只处理一段*包裹的内容,直接匹配*开头和结尾的内容就行:
// 写入临时文本时记得用*包裹,比如 `*${快速识别的文本}*` const requests = [ { replaceAllText: { replaceText: 准确识别的文本, containsText: { text: '\\*.*\\*', // 匹配从*开始到*结束的任意内容 wildcardRegex: true, matchCase: true } } } ];
多段临时文本的精准替换
如果文档里同时有多个*包裹的临时文本,怕替换错的话,给每个临时段加个唯一标识,比如UUID,格式改成*[唯一ID]${临时文本}*,替换时只匹配带这个ID的内容:
// 写入临时文本的时候: const tempId = crypto.randomUUID(); // 生成唯一ID const tempText = `*[${tempId}]${快速识别的文本}*`; // 把tempText写入文档的代码... // 替换时的请求: const requests = [ { replaceAllText: { replaceText: 准确识别的文本, containsText: { text: `\\*\\[${tempId}\\].*\\*`, // 匹配带指定ID的*包裹内容 wildcardRegex: true, matchCase: true } } } ];
额外注意事项
- 写入临时文本后,先确认文档里确实存在对应的*包裹内容,避免写入失败导致后续替换无目标
- 替换后可以检查下文档内容,要是没成功就重试一次
内容的提问来源于stack exchange,提问作者VladTbk321
相关产品推荐
相关产品推荐

