regex - 替换 Google Script 不支持的正则表达式
问题描述
我要实现的目标的简短背景:我有一个谷歌文档和一个谷歌表。google doc 包含文本,google sheet 包含 2 列:一个单词和它的翻译。该函数获取谷歌文档的正文并应该遍历“单词”col,识别正文中每个单词的所有外观并将其替换为翻译 - 但它仅匹配出现的完整单词和仅完全匹配. 基本上我想要的东西会更容易用一个例子来解释:假设我有“pop”这个词,它被翻译成“pretty”。我希望函数替换单词,但以下情况除外:
- 流行音乐
- 流行音乐
- 弹出
- ETC..
因此,基本上,只有在完全匹配且仅是整个单词的情况下才提到过。
这是函数,正则表达式工作正常,问题是谷歌脚本不支持它。我无法想出一个解决方案来替换我制作的正则表达式,而这个正则表达式可以工作并满足我的要求。我附上了代码,以防万一不清楚,如果您熟悉正则表达式,您将能够理解我的意思。
function replaceText(body, words, origin, translated) {
for(var i=0; i<words.length; i++){
var word = words[i][origin-1];
var regex = RegExp("(?:\\b)" + word + "\\b(?!\\')",'gi');
Logger.log(body.getText().match(regex));
Logger.log(body.replaceText(regex, translation));
var translation = words[i][translated-1];
var foundElement = body.replaceText(regex, translation);
}
return body;
}
此外,如果您有兴趣,请附上 Google 脚本支持的正则表达式的链接: https ://github.com/google/re2/wiki/Syntax
解决方案
首先,(?:\\b)
应该只是\\b
,单词边界无论如何都是零宽度,所以它不需要环顾四周。
其次,我了解您的问题与replaceText
. 该行body.getText().match(regex);
适用于常规的 JavaScript 字符串方法,它支持常用的正则表达式。问题是你需要replaceText
,而那个是不同的。
第三,replaceText
不将正则表达式对象作为参数:它的参数是字符串。再次检查文档。
最后,由于我们不想将'
其视为单词边界并且没有前瞻支持,因此解决方案是'
通过将其替换为不会自然出现的足够奇怪的字母数字字符串来进行转义。最后,换回来。
function translate() {
var body = DocumentApp.getActiveDocument().getBody();
var escape = "uJKiy5hzXNUWFDl7k2pSZoDZ8ipv6LR1ArTi6gXu"; // from https://www.random.org/strings/?num=2&len=20&digits=on&upperalpha=on&loweralpha=on&unique=on&format=html&rnd=new
body.replaceText("'", escape);
// the loop would begin here
var word = "pop";
body.replaceText("(?i)\\b" + word + "\\b", "translation");
// loop would end here.
body.replaceText(escape, "'");
}
请注意,不区分大小写的标志是(?i)
,并且替换replaceText
始终是全局的。
并注意花撇号:如果它们也需要特殊处理,请以类似方式转义它们,但使用其他一些随机字符串。
推荐阅读
- javascript - 模式内可扩展文本的 CSS 问题
- css - 所有 HTML 容器的 CSS 高度是否应为 100%
- powershell - FTP PowerShell 设置 - 高级设置
- rasa-nlu - 在 rasa 中训练模型后查找表不起作用
- python - python包不打包子目录下的文件
- vb.net - 我需要一些帮助来确定 vb.net 中函数的语法
- django - 对 Django 文本使用多个过滤器?
- python - 如何在熊猫中正确使用 .loc?
- asp.net - 在 UpdatePanel 内的 Gridview 中单击 LinkButton 后,引导数据表不起作用
- amazon-web-services - 如何使 AWS Codebuild 提示确认