Обработка строк в Google Apps Script: как эффективно работать с текстом?

Что такое строки и почему важна их обработка?

Строки в Google Apps Script представляют собой последовательности символов, используемые для хранения и обработки текста. Обработка строк играет ключевую роль в автоматизации задач, таких как анализ данных, генерация отчетов, обработка пользовательского ввода и взаимодействие с внешними API. Умение эффективно работать со строками позволяет создавать более гибкие и мощные скрипты.

Основные операции со строками: конкатенация, извлечение подстрок

Основные операции включают конкатенацию (объединение строк), извлечение подстрок (получение части строки), поиск и замену текста, преобразование регистра и другие. Эти операции являются фундаментальными для манипулирования текстовыми данными.

Типы строк в Google Apps Script: примитивы и объекты

В Google Apps Script строки могут быть представлены как примитивы (простые строковые значения) или как объекты String. Оба типа могут использоваться взаимозаменяемо в большинстве случаев, но важно понимать их различия, особенно при работе с методами и свойствами.

Базовые методы работы со строками

Определение длины строки: метод `length`

Метод length возвращает количество символов в строке.

/**
 * Возвращает длину строки.
 * @param {string} str Входная строка.
 * @return {number} Длина строки.
 */
function getStringLength(str: string): number {
  return str.length;
}

const myString: string = "Hello, world!";
const stringLength: number = getStringLength(myString); // 13
Logger.log(stringLength);

Извлечение символов: метод `charAt()`

Метод charAt(index) возвращает символ, находящийся по указанному индексу. Индексация начинается с 0.

/**
 * Возвращает символ по указанному индексу.
 * @param {string} str Входная строка.
 * @param {number} index Индекс символа.
 * @return {string} Символ по индексу.
 */
function getCharacterAtIndex(str: string, index: number): string {
  return str.charAt(index);
}

const myString: string = "Google";
const character: string = getCharacterAtIndex(myString, 0); // "G"
Logger.log(character);

Поиск подстрок: методы `indexOf()`, `lastIndexOf()` и `includes()`

indexOf(substring) возвращает индекс первого вхождения подстроки. Если подстрока не найдена, возвращает -1.

lastIndexOf(substring) возвращает индекс последнего вхождения подстроки. Если подстрока не найдена, возвращает -1.

includes(substring) возвращает true, если строка содержит указанную подстроку, и false в противном случае.

/**
 * Поиск индекса подстроки в строке.
 * @param {string} str Входная строка.
 * @param {string} substring Подстрока для поиска.
 * @return {number} Индекс подстроки или -1, если не найдена.
 */
function findSubstringIndex(str: string, substring: string): number {
  return str.indexOf(substring);
}

const myString: string = "This is a test string";
const index: number = findSubstringIndex(myString, "test"); // 10
Logger.log(index);

/**
 * Проверяет, содержит ли строка указанную подстроку.
 * @param {string} str Входная строка.
 * @param {string} substring Подстрока для поиска.
 * @return {boolean} True, если строка содержит подстроку, иначе false.
 */
function stringIncludesSubstring(str: string, substring: string): boolean {
  return str.includes(substring);
}

const contains: boolean = stringIncludesSubstring(myString, "test"); // true
Logger.log(contains);

Извлечение подстрок: методы `substring()`, `slice()` и `substr()`

substring(startIndex, endIndex) извлекает подстроку от startIndex (включительно) до endIndex (исключительно).

slice(startIndex, endIndex) аналогичен substring(), но может принимать отрицательные индексы (отсчет с конца строки).

substr(startIndex, length) извлекает подстроку, начинающуюся с startIndex и имеющую указанную length.

/**
 * Извлекает подстроку из строки.
 * @param {string} str Входная строка.
 * @param {number} startIndex Индекс начала подстроки.
 * @param {number} endIndex Индекс конца подстроки (не включительно).
 * @return {string} Извлеченная подстрока.
 */
function extractSubstring(str: string, startIndex: number, endIndex: number): string {
  return str.substring(startIndex, endIndex);
}

const myString: string = "Example string";
const substring: string = extractSubstring(myString, 0, 7); // "Example"
Logger.log(substring);

Модификация строк: замена и преобразование регистра

Замена подстрок: метод `replace()` (простой и с регулярными выражениями)

Метод replace(searchValue, replaceValue) заменяет первое вхождение searchValue на replaceValue. Для замены всех вхождений можно использовать регулярные выражения с флагом g.

/**
 * Заменяет подстроку в строке.
 * @param {string} str Входная строка.
 * @param {string} searchValue Подстрока для замены.
 * @param {string} replaceValue Новая подстрока.
 * @return {string} Строка с замененной подстрокой.
 */
function replaceSubstring(str: string, searchValue: string, replaceValue: string): string {
  return str.replace(searchValue, replaceValue);
}

const myString: string = "This is a test string test";
const replacedString: string = replaceSubstring(myString, "test", "example"); // "This is a example string test"
Logger.log(replacedString);

/**
 * Заменяет все вхождения подстроки в строке с использованием регулярного выражения.
 * @param {string} str Входная строка.
 * @param {string} searchValue Подстрока для замены.
 * @param {string} replaceValue Новая подстрока.
 * @return {string} Строка со всеми замененными подстроками.
 */
function replaceAllSubstrings(str: string, searchValue: string, replaceValue: string): string {
  const regex = new RegExp(searchValue, 'g');
  return str.replace(regex, replaceValue);
}

const replacedAllString: string = replaceAllSubstrings(myString, "test", "example"); // "This is a example string example"
Logger.log(replaceAllString);
Реклама

Преобразование регистра: методы `toUpperCase()` и `toLowerCase()`

toUpperCase() преобразует строку в верхний регистр.

toLowerCase() преобразует строку в нижний регистр.

/**
 * Преобразует строку в верхний регистр.
 * @param {string} str Входная строка.
 * @return {string} Строка в верхнем регистре.
 */
function convertToUpperCase(str: string): string {
  return str.toUpperCase();
}

const myString: string = "Hello";
const upperCaseString: string = convertToUpperCase(myString); // "HELLO"
Logger.log(upperCaseString);

Удаление пробелов: метод `trim()`

Метод trim() удаляет пробелы в начале и конце строки.

/**
 * Удаляет пробелы в начале и конце строки.
 * @param {string} str Входная строка.
 * @return {string} Строка без пробелов в начале и конце.
 */
function trimString(str: string): string {
  return str.trim();
}

const myString: string = "   Hello world!   ";
const trimmedString: string = trimString(myString); // "Hello world!"
Logger.log(trimmedString);

Работа с регулярными выражениями для сложных операций

Основы регулярных выражений: символы, классы, квантификаторы

Регулярные выражения (regex) — это мощный инструмент для поиска и манипулирования текстом. Они позволяют описывать шаблоны, которым должен соответствовать текст. Основные элементы:

Символы: . (любой символ), \[] (набор символов), \d (цифра), \w (буква, цифра, подчеркивание), \s (пробельный символ).

Классы: [a-z] (любая строчная буква), [0-9] (любая цифра).

Квантификаторы: * (0 или более раз), + (1 или более раз), ? (0 или 1 раз), {n} (ровно n раз), {n,} (n или более раз), {n,m} (от n до m раз).

Использование регулярных выражений в методах `match()`, `search()` и `replace()`

match(regex) возвращает массив совпадений с регулярным выражением.

search(regex) возвращает индекс первого совпадения или -1, если совпадений нет.

replace(regex, replaceValue) заменяет все совпадения с регулярным выражением на replaceValue.

Примеры использования: проверка формата email, извлечение данных из текста

/**
 * Проверяет формат email с помощью регулярного выражения.
 * @param {string} email Email для проверки.
 * @return {boolean} True, если email соответствует формату, иначе false.
 */
function validateEmail(email: string): boolean {
  const emailRegex: RegExp = /^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$/;
  return emailRegex.test(email);
}

const email: string = "test@example.com";
const isValidEmail: boolean = validateEmail(email); // true
Logger.log(isValidEmail);

/**
 * Извлекает все числа из строки с помощью регулярного выражения.
 * @param {string} str Входная строка.
 * @return {Array | null} Массив найденных чисел или null, если ничего не найдено.
 */
function extractNumbers(str: string): Array | null {
  const numberRegex: RegExp = /\d+/g;
  return str.match(numberRegex);
}

const text: string = "There are 123 apples and 456 oranges.";
const numbers: Array | null = extractNumbers(text); // ["123", "456"]
Logger.log(numbers);

Продвинутые техники и оптимизация

Форматирование строк: использование шаблонов и `Utilities.formatString()`

Utilities.formatString() позволяет форматировать строки, подставляя значения в шаблоны.

/**
 * Форматирует строку с использованием Utilities.formatString().
 * @param {string} template Шаблон строки.
 * @param {...any} args Аргументы для подстановки в шаблон.
 * @return {string} Отформатированная строка.
 */
function formatString(template: string, ...args: any[]): string {
  return Utilities.formatString(template, ...args);
}

const name: string = "John";
const age: number = 30;
const formattedString: string = formatString("My name is %s and I am %s years old.", name, age); // "My name is John and I am 30 years old."
Logger.log(formattedString);

Разбиение строк на массивы: метод `split()`

Метод split(separator) разбивает строку на массив подстрок, используя указанный разделитель.

/**
 * Разбивает строку на массив подстрок по разделителю.
 * @param {string} str Входная строка.
 * @param {string} separator Разделитель.
 * @return {Array} Массив подстрок.
 */
function splitString(str: string, separator: string): string[] {
  return str.split(separator);
}

const csvString: string = "apple,banana,orange";
const fruits: string[] = splitString(csvString, ","); // ["apple", "banana", "orange"]
Logger.log(fruits);

Соединение массивов в строки: метод `join()`

Метод join(separator) объединяет элементы массива в строку, используя указанный разделитель.

/**
 * Объединяет массив строк в одну строку с разделителем.
 * @param {Array} arr Массив строк.
 * @param {string} separator Разделитель.
 * @return {string} Объединенная строка.
 */
function joinArray(arr: string[], separator: string): string {
  return arr.join(separator);
}

const fruitArray: string[] = ["apple", "banana", "orange"];
const joinedString: string = joinArray(fruitArray, ", "); // "apple, banana, orange"
Logger.log(joinedString);

Оптимизация производительности при работе с большими объемами текста

При работе с большими объемами текста важно учитывать производительность. Использование регулярных выражений может быть ресурсоемким. Рассмотрите возможность использования встроенных методов строк, когда это возможно. Также, избегайте многократного конкатенирования строк в цикле, вместо этого используйте массивы для накопления данных и метод join() для создания итоговой строки.


Добавить комментарий