问题描述
我想自动进行一些文档编辑。现在,我正在尝试用〜
替换测验列表中不正确的元素例如,假设在文档中我具有以下内容,并且已经使用=标记了正确的选择。
The capital of norway is:
a. Haifa
=oslo
c. Lund
d. the Hague
e. Manitoba
我想创建一个脚本来替换a。,c。,d。和e。每个都有〜
function incorrectAnswera(){
var body = DocumentApp.getActiveDocument().getBody();
body.replaceText("a.","~");
}
但是它将替换“ a”的每个实例以及后跟〜的字符。例如,地球变成E〜th。
解决方法
Text.replaceText(searchPattern,replacement)
对searchPattern
使用regular expressions,特别是Google的RE2 library。
作为正则表达式,a.
将匹配字母“ a”加上其后的任何字符,因为.
是正则表达式中的特殊“通配符”,匹配任何字符。
作为正则表达式约定,您可以使用反斜杠.
从\.
字符中删除特殊含义。但是,由于Apps脚本实现将JavaScript字符串作为输入,因此必须(烦人地)添加额外反斜杠才能获得所需的效果。
a\\.
匹配字符序列“ a”,后跟一个句点。
这仍然会造成严重破坏,因为如果您有这句话
在雨中,我用雨伞。
它将替换为
在雨中,我用雨伞〜
要解决此问题,我们需要指定表达式的行开头,并为此保留^
字符。
^a\\.
仅在行以“ a”开头并加句点的情况下替换。
要实现您设定的目标:
我想创建一个脚本来替换a。,c。,d。和e。每个都有〜
您还需要使用一组字符来进行匹配,以使用[
和]
进行定义。
要按面值索取您的请求,该集合应为[acde]
,但是由于您已经用=
标记了正确的答案,也许只是使用范围“ a”至“ e”更好:[a-e]
(包括从a到e的所有5个字母)。
作为最后的细节,如果您希望在a.
序列前面使用空白,可以使用\\s*
来表示“零个或多个空白字符”,但是替换为可能会删除空白。
// mark the start of the correct answer with a "=" before running this function
function markIncorrectAnswers() {
DocumentApp.getActiveDocument().getBody()
.replaceText("^\\s*[a-e]\\.","~");
}