恰好匹配 Google Apps 脚本中的两个连续空格
Matching exactly two consecutive spaces in Google Apps Scripts
我正在尝试使用 DocumentApp.getActiveDocument().getBody().replaceText()
准确匹配两个连续的 space 并将它们替换为单个 space。
遗憾的是,它只支持部分正则表达式 (https://github.com/google/re2/wiki/Syntax)。
我试过 DocumentApp.getActiveDocument().getBody().replaceText("[^ ] {2}[^ ]", " ")
但它也匹配文本周围的字符。
我已经试过 DocumentApp.getActiveDocument().getBody().replaceText("([^ ]) {2}([^ ])", " ")
但这输出“$1 $2”而不是“character character”
我试过 DocumentApp.getActiveDocument().getBody().replaceText(" {2}", " ")
,但它也匹配更大的 space 组中的两个 space。
很难(对我来说)为所需的替换编写一个正则表达式,因为每次也替换周围的字符(非空格)。此外,在一般情况下,我们应该考虑到空格位置在字符串的最开头或结尾的特殊情况。
因此,我建议以下 2 个函数用于各种替换:
function replaceDoubleSpace() {
var body = DocumentApp.getActiveDocument().getBody();
var count = replaceWithPattern('^ $', body);
Logger.log(count + ' replacement(s) done for the entire string');
count = replaceWithPattern('[^ ]{1} [^ ]{1}', body);
Logger.log(count + ' replacement(s) done inside the string');
count = replaceWithPattern('^ [^ ]{1}', body);
Logger.log(count + ' replacement(s) done at the beginning of the string');
count = replaceWithPattern('[^ ]{1} $', body);
Logger.log(count + ' replacement(s) done at the end of the string');
}
function replaceWithPattern(pat, body) {
var patterns = [];
var count = 0;
while (true) {
var range = body.findText(pat);
if (range == null) break;
var text = range.getElement().asText().getText();
var pos = range.getStartOffset() + 1;
text = text.substring(0, pos) + text.substring(pos + 1);
range.getElement().asText().setText(text);
count++;
}
return count;
}
当然,第一个函数可能会被简化,但在这种情况下它的可读性会变差:
function replaceDoubleSpace() {
var body = DocumentApp.getActiveDocument().getBody();
var count = replaceWithPattern('^ $|[^ ]{1} [^ ]{1}|^ [^ ]{1}|[^ ]{1} $', body);
Logger.log(count + ' replacement(s) done');
}
我正在尝试使用 DocumentApp.getActiveDocument().getBody().replaceText()
准确匹配两个连续的 space 并将它们替换为单个 space。
遗憾的是,它只支持部分正则表达式 (https://github.com/google/re2/wiki/Syntax)。
我试过 DocumentApp.getActiveDocument().getBody().replaceText("[^ ] {2}[^ ]", " ")
但它也匹配文本周围的字符。
我已经试过 DocumentApp.getActiveDocument().getBody().replaceText("([^ ]) {2}([^ ])", " ")
但这输出“$1 $2”而不是“character character”
我试过 DocumentApp.getActiveDocument().getBody().replaceText(" {2}", " ")
,但它也匹配更大的 space 组中的两个 space。
很难(对我来说)为所需的替换编写一个正则表达式,因为每次也替换周围的字符(非空格)。此外,在一般情况下,我们应该考虑到空格位置在字符串的最开头或结尾的特殊情况。
因此,我建议以下 2 个函数用于各种替换:
function replaceDoubleSpace() {
var body = DocumentApp.getActiveDocument().getBody();
var count = replaceWithPattern('^ $', body);
Logger.log(count + ' replacement(s) done for the entire string');
count = replaceWithPattern('[^ ]{1} [^ ]{1}', body);
Logger.log(count + ' replacement(s) done inside the string');
count = replaceWithPattern('^ [^ ]{1}', body);
Logger.log(count + ' replacement(s) done at the beginning of the string');
count = replaceWithPattern('[^ ]{1} $', body);
Logger.log(count + ' replacement(s) done at the end of the string');
}
function replaceWithPattern(pat, body) {
var patterns = [];
var count = 0;
while (true) {
var range = body.findText(pat);
if (range == null) break;
var text = range.getElement().asText().getText();
var pos = range.getStartOffset() + 1;
text = text.substring(0, pos) + text.substring(pos + 1);
range.getElement().asText().setText(text);
count++;
}
return count;
}
当然,第一个函数可能会被简化,但在这种情况下它的可读性会变差:
function replaceDoubleSpace() {
var body = DocumentApp.getActiveDocument().getBody();
var count = replaceWithPattern('^ $|[^ ]{1} [^ ]{1}|^ [^ ]{1}|[^ ]{1} $', body);
Logger.log(count + ' replacement(s) done');
}