Google Apps Script Greedy Regex - PullRequest
       12

Google Apps Script Greedy Regex

0 голосов
/ 11 декабря 2018

Не могу понять, почему это регулярное выражение поглощает всю строку в Google Docs.Когда я запускаю это, я не могу заставить его вернуть только {{ClientName}}

Вот мой текст из моего документа.

{{ClientName}} would like to have a {{Product}} {{done/created}}. The purpose of this {{Product}} is to {{ProductPurpose}}. We have experience with such testing and development, and will develop and test the {{Product}} for {{ClientName}}.

function searchAndFind () {
     var foundText = DocumentApp.getActiveDocument().getBody().findText('\{\{([^,\s}{][a-zA-Z]+)\}\}').getElement().asText().getText()
     return foundText
}

Ответы [ 3 ]

0 голосов
/ 11 декабря 2018

Попробуйте это:

function searchAndFind () {
  var foundElement = DocumentApp.getActiveDocument().getBody().findText('\{\{([^,\s}{][a-zA-Z]+)\}\}').getElement().asText().getText();
  var start=DocumentApp.getActiveDocument().getBody().findText('\{\{([^,\s}{][a-zA-Z]+)\}\}').getStartOffset();
  var end=DocumentApp.getActiveDocument().getBody().findText('\{\{([^,\s}{][a-zA-Z]+)\}\}').getEndOffsetInclusive();
  var foundText=foundElement.slice(start,end+1);
  Logger.log('\nfoundElement: %s\nstart: %s\nend: %s\nfoundText:%s\n',foundElement,start,end,foundText);
  return foundText;

Выход Logger.log:

[18-12-11 13:04:34:863 MST] 
foundElement: {{ClientName}} would like to have a {{Product}} {{done/created}}. The purpose of this {{Product}} is to {{ProductPurpose}}. We have experience with such testing and development, and will develop and test the {{Product}} for {{ClientName}}.
start: 0.0
end: 13.0
foundText:{{ClientName}}
0 голосов
/ 11 декабря 2018

Regex по умолчанию «жадный».Вы можете сделать квантификатор (то есть. +, ?, * или {}) нежадным, следуя квантификатору с ?.

Например:

  • x??
  • x*?
  • x+?
  • x{n}?
  • x{n,}?
  • x{n,m}?

Измените свое регулярное выражение, чтобы использовать эту функцию.

Проверьте документацию по регулярному выражению в MDN и выполните поиск (CTRL + F в хром) длятермин «жадный» для получения дополнительной информации.

0 голосов
/ 11 декабря 2018

Проблема:

Это потому, что findText() возвращает объект RangeElement, который предоставляет методы для получения полного текста Element, а также offset фактического сопоставленного текста в Element.Когда вы используете getElement(), вы получаете весь элемент вместо совпадающей строки.

Решение:

Получить смещения от элемента диапазона, чтобы получить фактический текст в элементе.

Фрагмент кода:

 function searchAndFind() {
  var rangeElement = DocumentApp.getActiveDocument()
    .getBody()
    .findText('{{([^,\\s]+)}}');

  return rangeElement
    .getElement()
    .asText()
    .getText()
    .substring(
      rangeElement.getStartOffset(),
      rangeElement.getEndOffsetInclusive()+1
    );
}

Ссылки:

...