我今天在这里得到了惊人的帮助!
我想做点别的。我在Google中有一个编号的问题列表,我想用其他的东西来替换这些数字。
例如,我想替换列表中的数字,如:
通过以下方式:
*Q09::地球在一年的哪个月离太阳最近?~7月~6月=1月~3月~9月
::问题11:在澳大利亚(南半球),白天是最短的,夜晚是最长的?~在12月底~3月底=6月底~4月底~白天和夜晚在澳大利亚全年几乎一样长
我尝试过使用以前的帖子中的建议,但只想出了如下这样的东西,这似乎不起作用。
谢谢你在这里!
function questionName2(){
var body = DocumentApp.getActiveDocument().getBody();
var text = body.editAsText();
var pattern = "^[1-9]";
var found = body.findText(pattern);
var matchPosition = found.getStartOffset();
while(found){
text.insertText(matchPosition,'::Q0');
found = body.findText(pattern, found);
}
}发布于 2020-08-23 12:53:26
正则表达式
Text.findText(searchPattern)使用一个字符串,该字符串将被解析为正则表达式,使用谷歌的RE2库作为searchPattern。以这种方式使用字符串时,每当从字符中删除特殊意义时,我们都需要添加一个额外的反斜杠,例如匹配问号后面的句点,或者对数字使用像\d这样的字符匹配集。
^\\s*\\d+?\\.将匹配一组数字,其长度为任何非零长度,以任何长度(包括零)的前导空格开始行。\d代表数字,+是一个或多个,组合+?使匹配变懒。这里不需要懒惰部分,但我的习惯是默认懒散以避免bug。另一种选择是专门匹配1到2位数字的\d{1,2}。
要从匹配的文本中仅提取数字,我们可以使用JavaScript RegExp对象。与Doc正则表达式不同,这个正则表达式不需要额外的反斜杠,并且允许我们使用括号捕获组。
^\s*(\d+?)\.几乎和上面一样,除了没有多余的斜杠之外,我们现在将“保存”这些数字,以便我们可以在替换字符串中使用它们。我们使用括号标记要保存的内容。因为这将是一个普通的JavaScript正则表达式文字,所以我们将用斜杠:/^\s*(\d+?)\./包装整件事情,但是开始和结束/只是表示这是一个RegExp文本。
文本元素和文本字符串
Text.findText可以返回的不仅仅是我们所要求的完全匹配:它返回包含文本的整个元素加上正则表达式匹配的索引。为了执行搜索和替换捕获组,我们必须使用索引删除旧文本,然后插入新文本。
下面的分配为我们提供了执行搜索和替换所需的所有数据:首先是元素,然后是开始和停止索引,最后是使用slice提取匹配的文本字符串(注意,片使用排它的端,而Doc使用包含的端,因此是+1)。
var found = DocumentApp.getActiveDocument().getBody().findText(pattern);
var matchStart = found.getStartOffset();
var matchEnd = found.getEndOffsetInclusive();
var matchElement = found.getElement().asText();
var matchText = matchElement.getText().slice(matchStart, matchEnd + 1);注意事项
正如Tanaike在注释中指出的那样,这假设编号不是列表项目,它自动生成数字,而是手动输入的数字。如果使用的是自动生成的数字列表,则API不允许您编辑编号格式。
这个答案还假设在示例中,当您映射“9”时。致::Q09::“和”10到"::Q11::",10到11的映射是一个错误。如果这是有意的,请更新问题,以澄清为什么编号可能改变的规则。
还假定数字应该小于100,给出"Q09“的零填充示例。该示例应该足够灵活,允许您在需要时将其更新为不同的填充方案。
全例
因为这个问题没有使用任何V8特性,所以这假设是旧的Rhino环境。
/**
* Replaces "1." with "::Q01::"
*/
function updateQuestionNumbering(){
var text = DocumentApp.getActiveDocument().getBody();
var pattern = "^\\s*\\d+?\\.";
var found = text.findText(pattern);
while(found){
var matchStart = found.getStartOffset();
var matchEnd = found.getEndOffsetInclusive();
var matchElement = found.getElement().asText();
var matchText = matchElement.getText().slice(matchStart, matchEnd + 1);
matchElement.deleteText(matchStart, matchEnd);
matchElement.insertText(matchStart, matchText.replace(/^\s*(\d+?)\./, replacer));
found = text.findText(pattern, found);
}
/**
* @param {string} _ - full match (ignored)
* @param {string} number - the sequence of digits matched
*/
function replacer(_, number) {
return "::Q" + padStart(number, 2, "0") + "::";
}
// use String.prototype.padStart() in V8 environment
// above usage would become `number.padStart(2, "0")`
function padStart(string, targetLength, padString) {
while (string.length < targetLength) string = padString + string;
return string;
}
}https://stackoverflow.com/questions/63543020
复制相似问题