Совпадение ровно двух последовательных пробелов в скриптах Google Apps - PullRequest
0 голосов
/ 19 февраля 2019

Я пытаюсь сопоставить ровно два последовательных пробела, используя 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", а не " символ символ "

Я пробовал DocumentApp.getActiveDocument().getBody().replaceText(" {2}", " "), но это также соответствует двумпробелы в большей группе пространств.

1 Ответ

0 голосов
/ 19 февраля 2019

Было трудно (для меня) написать одно регулярное выражение для требуемых замен, потому что окружающие символы (не пробелы) также заменялись каждый раз.Более того, в общем случае мы должны учитывать особые случаи, когда позиция пробелов находится в самом начале строки или в конце.

В результате я предлагаю 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');
}
...