完全匹配Google Apps脚本中的两个连续空格

时间:2019-02-19 04:13:30

标签: regex google-apps-script google-docs

我正在尝试使用DocumentApp.getActiveDocument().getBody().replaceText()来精确匹配两个连续的空格,并将它们替换为一个空格。

不幸的是,它仅支持某些正则表达式(https://github.com/google/re2/wiki/Syntax)。

我尝试过DocumentApp.getActiveDocument().getBody().replaceText("[^ ] {2}[^ ]", " "),但它也与围绕文字的字符匹配。

我尝试过DocumentApp.getActiveDocument().getBody().replaceText("([^ ]) {2}([^ ])", "$1 $2"),但是输出的是“ $ 1 $ 2”,而不是“ character character

我尝试过DocumentApp.getActiveDocument().getBody().replaceText(" {2}", " "),但它也可以匹配更大一组空格中的两个空格。

1 个答案:

答案 0 :(得分:1)

(对我来说)很难为所需的替换写一个正则表达式,因为周围的字符(非空格)也会被替换。而且,在一般情况下,当空格位置位于字符串的开头或结尾时,我们应考虑特殊情况。

因此,我建议为以下各种替换使用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');
}