В дополнение к ответу Танаике, этот ответ намеревается показать, что можно сделать, если бы вам пришлось использовать метод findText()
(например, одновременное изменение атрибутов элемента, выделение совпадающих диапазонов и т. Д. c).
Проблема в том, что «данные» теперь весь абзац
Ну, это именно из-за предоставленных инструкций:
- Результат
getElement()
сам по себе Element
. - Результатом
asText()
на Element
является Text
экземпляр. - Результат
getText()
на Text
состоит в том, чтобы процитировать документы:
содержимое элемента в виде текстовой строки
есть ли способ захвата и использования данных
С findText()
это кажется невозможным в соответствии с документами в то время слова, чтобы процитировать его для потомков:
Подмножество функций JavaScript регулярных выражений не полностью поддерживаются, таких как группы захвата и модификаторы режима.
Что делать?
Когда совпадение найдено, findText()
возвращает экземпляр RangeElement
, который имеет два интересующих метода: getStartOffset()
и getEndOffsetInclusive()
. Возвращаемые значения этих методов указывают на символ indexes текстового содержимого элемента. Таким образом, подобранная подстрока может быть извлечена с помощью метода substring()
(или с помощью slice()
).
Вы можете использовать from
параметр метода findText()
рекурсивно для итерации по результатам сопоставления, чтобы получить все подходящие диапазоны.
/**
* @summary pattern wrapper
* @param {string} linkPattern
* @param {RegExp} [infoPattern]
*/
const matchText = (linkPattern, infoPattern) =>
/**
* @summary finds links in text elements
* @param {GoogleAppsScript.Document.Paragraph} elem
* @param {string} [text]
* @param {GoogleAppsScript.Document.RangeElement} [from]
* @param {string[]} [matches]
* @returns {string[][]}
*/
(elem, text = elem.getText(), from, matches = []) => {
const match = from ?
elem.findText(linkPattern, from) :
elem.findText(linkPattern);
if(match) {
const rangeStart = match.getStartOffset();
const rangeEnd = match.getEndOffsetInclusive();
const link = text.substring( rangeStart, rangeEnd + 1 );
const [ full, ...groups ] = link.match( infoPattern );
matches.push(groups);
return matchText(linkPattern, infoPattern)(elem, text, match, matches);
}
return matches;
}
Скрипт драйвера для тестирования:
function findText() {
const doc = getTestDoc(); //gets doc somehow, not provided here
const body = doc.getBody();
const par = body.appendParagraph("Some paragraph with some data in it https://example.com/ford/some/other/data.html.\nThere is another link also here https://example.com/ford/latest.html.");
const pattern = 'http(?:s)*:\/\/(?:www\.)*example\.com\/\\w+';
const targetPattern = /\/(\w+)$/;
const results = matchText(pattern,targetPattern)(par);
Logger.log(results); //[[ford], [ford]]
}
Примечания
- Любопытное наблюдение: видимо, для прохождения токены (
\w
, \s
, et c) к выражению string
, необходимо escape backsla sh (например, \\w
будет проанализирован правильно). - Обратите внимание, что приведенное выше решение возвращает
string[][]
для извлечения всех групп захвата () - Приведенный выше пример кода предназначен для среды выполнения V8.
Список литературы
getElement()
spe c asText()
spe c getText()
spe c findText()
spe c getStartOffset()
spe c getEndOffsetInclusive()
spe c substring()
документы на MDN