Как в параметрах скрипта передать две строки
Перейти к содержимому

Как в параметрах скрипта передать две строки

  • автор:

Все, что вы хотели знать о подстановке переменных в строках

Переменные в строках можно использовать множеством способов. Я называю это подстановкой переменных, но подразумеваю все ситуации, когда необходимо отформатировать строку с учетом значений переменных. Мне часто приходится объяснять этот момент новичкам, изучающим создание скриптов.

Оригинал этой статьи впервые был опубликован в блоге автора @KevinMarquette. Группа разработчиков PowerShell благодарит Кевина за то, что он поделился с нами этими материалами. Читайте его блог — PowerShellExplained.com.

Объединение

Первый класс методов можно называть объединением. По сути, они принимают несколько строк и объединяют их друг с другом. Объединение уже довольно давно используется для создания форматированных строк.

$name = 'Kevin Marquette' $message = 'Hello, ' + $name 

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

$first = 'Kevin' $last = 'Marquette' 
$message = 'Hello, ' + $first + ' ' + $last + '.' 

Этот простой пример читать уже труднее.

Подстановка переменных

В PowerShell есть более простой вариант. Переменные можно задавать непосредственно в строках.

$message = "Hello, $first $last." 

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

Подстановка команд

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

$directory = Get-Item 'c:\windows' $message = "Time: $directory.CreationTime" 

Казалось бы, вы должны получить CreationTime из $directory , но вместо этого вы получаете в качестве значения Time: c:\windows.CreationTime . Причина в том, что подстановка такого типа распознает только базовую переменную. Она интерпретирует точку как часть строки, поэтому не сопоставляет значение на более глубоких уровнях.

Выходит так, что при помещении в строку этот объект предоставляет строку в качестве значения по умолчанию. Некоторые объекты вместо этого предоставляют имя типа, например System.Collections.Hashtable . Это то, на что нужно обратить внимание.

PowerShell позволяет выполнять команды внутри строки с помощью специального синтаксиса. Это позволяет получить свойства этих объектов и выполнить любую другую команду для получения значения.

$message = "Time: $($directory.CreationTime)" 

Этот подход отлично подходит для определенных ситуаций, но в некоторых случаях может оказаться таким же неудобным, как объединение при наличии нескольких переменных.

Выполнение команды

Команды можно выполнять внутри строки. Хотя так можно делать, мне это не нравится. Код быстро становится перегруженным, и его трудно отлаживать. Я либо использую команду и сохраняю ее результат в переменную, либо использую строку форматирования.

$message = "Date: $(Get-Date)" 

Строка форматирования

.NET позволяет отформатировать строки, с которыми довольно легко работать. Сначала позвольте продемонстрировать статический метод, после чего я покажу, как сделать то же самое с помощью ярлыка PowerShell.

# .NET string format string [string]::Format('Hello, .',$first,$last) # PowerShell format string 'Hello, .' -f $first, $last 

В этом случае строка анализируется на наличие токенов и , а затем этот номер используется для выбора среди предоставленных значений. Если вы хотите повторить одно значение в строке, можно повторно использовать его номер.

При таком подходе чем сложнее строка, тем больше значений будет получено.

Форматирование значений в виде массивов

Если строка форматирования слишком длинная, можно сначала поместить значения в массив.

$values = @( "Kevin" "Marquette" ) 'Hello, .' -f $values 

Это не сплаттинг, поскольку я передаю весь массив, но идея аналогична.

Расширенное форматирование

Я намеренно использовал для вызова .NET, так как для этой платформы уже хорошо задокументировано множество вариантов форматирования. Существуют встроенные способы форматирования различных типов данных.

"" -f (Get-Date) "Population " -f 8175133 
20211110 Population 8,175,133 

Рассматривать я их не буду, лишь упомяну, что это очень эффективный механизм форматирования, который вы можете использовать при необходимости.

Объединение строк

Иногда требуется сцепить список значений вместе. Это можно сделать с помощью оператора -join . Он даже позволяет указать символ для объединения строк.

$servers = @( 'server1' 'server2' 'server3' ) $servers -join ',' 

Если с помощью -join необходимо объединить несколько строк без разделителя, необходимо указать пустую строку » . Но если нужно сделать только это, существует более быстрый вариант.

[string]::Concat('server1','server2','server3') [string]::Concat($servers) 

Также стоит отметить, что с помощью оператора -split строки можно разделить.

Join-Path

Этот командлет часто бывает неудобен, но он отлично подходит для создания пути к файлу.

$folder = 'Temp' Join-Path -Path 'c:\windows' -ChildPath $folder 

Самое замечательное в нем то, что он правильно обрабатывает обратные косые черты, когда собирает значение воедино. Это особенно важно, если вы принимаете значения от пользователей или файлов конфигурации.

Он также прекрасно работает с Split-Path и Test-Path . Я также рассказываю о нем в публикации о чтении и сохранении в файлы.

Строки как массивы

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

Взгляните на этот пример.

$message = "Numbers: " foreach($number in 1..10000)

Он выглядит очень простым, но на самом деле при каждом добавлении строки в $message создается полностью новая строка. Для этого выделяется память, в нее копируются данные, а старая строка удаляется. Ничего особенного, если такая операция выполняется лишь несколько раз, но в случае цикла, подобного этому, это может быть проблемой.

StringBuilder

Класс StringBuilder также очень часто используется для создания больших строк из множества строк меньшего размера. Его популярность связана с тем, что он просто собирает все добавленные в него строки, а затем сцепляет их в конце при извлечении значения.

$stringBuilder = New-Object -TypeName "System.Text.StringBuilder" [void]$stringBuilder.Append("Numbers: ") foreach($number in 1..10000) < [void]$stringBuilder.Append(" $number") >$message = $stringBuilder.ToString() 

Опять же, именно поэтому я использую .NET. Пользуюсь я им нечасто, но знать о его существовании будет не лишним.

Разграничение с помощью фигурных скобок

Этот метод используется для объединения суффикса с другими данными в строке. Иногда у переменной отсутствует четкая граница слова.

$test = "Bet" $tester = "Better" Write-Host "$test $tester $ter" 

Благодарю /u/real_parbold за эту идею.

Вот альтернатива данному подходу.

Write-Host "$test $tester $($test)ter" Write-Host "  ter" -f $test, $tester 

Лично я использую для этого строку форматирования, но знать о такой возможности будет не лишним на тот случай, если вам она где-то встретится.

Токены для поиска и замены

Хотя большая часть этих функций призвана снизить потребность в развертывании собственного решения, их можно применять и в тех случаях, когда необходимо заменить строки в больших файлах шаблонов.

Предположим, что вы извлекли шаблон из файла, который содержит большой объем текста.

$letter = Get-Content -Path TemplateLetter.txt -RAW $letter = $letter -replace '#FULL_NAME#', 'Kevin Marquette' 

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

Недавно я обнаружил новый подход для решения этой задачи. Так как это довольно распространенная схема, я не стану вдаваться в дальнейшие подробности в этом разделе.

Замена нескольких токенов

Если у меня есть список токенов, которые нужно заменить, я использую более универсальный подход. Я помещаю их в хэш-таблицу и перебираю их методом итерации, чтобы выполнить замену.

$tokenList = @ < Full_Name = 'Kevin Marquette' Location = 'Orange County' State = 'CA' >$letter = Get-Content -Path TemplateLetter.txt -RAW foreach( $token in $tokenList.GetEnumerator() ) < $pattern = '##' -f $token.key $letter = $letter -replace $pattern, $token.Value > 

При необходимости эти токены можно загрузить из файла JSON или CSV.

Метод ExpandString класса ExecutionContext

Существует отличный способ, который заключается в том, чтобы определить строку подстановки с помощью одинарных кавычек, а затем развернуть переменные. Взгляните на этот пример.

$message = 'Hello, $Name!' $name = 'Kevin Marquette' $string = $ExecutionContext.InvokeCommand.ExpandString($message) 

При вызове .InvokeCommand.ExpandString в текущем контексте выполнения для подстановки используются переменные в текущей области. Ключевым моментом здесь является то, что $message можно определить заранее, когда переменные еще даже не существуют.

Немного дополнив этот код, можно обеспечить повторное выполнение этой замены для различных значений.

$message = 'Hello, $Name!' $nameList = 'Mark Kraus','Kevin Marquette','Lee Dailey' foreach($name in $nameList)

Развивая эту идею, можно импортировать большой шаблон электронной почты из текстового файла. Я благодарю Марка Крауса за это предложение.

Оптимальный вариант для конкретной ситуации

Мне нравится подход со строками форматирования. Я применяю его для более сложных строк или при наличии нескольких переменных. Но для коротких строк подойдет любой из описанных методов.

Что-нибудь еще?

Я лишь вкратце затронул эту тему. Я надеюсь, что вы сможете двигаться дальше, узнав для себя что-то новое.

Ссылки.

Если вы хотите узнать больше о методах и функциях, которые позволяют интерполяции строк, см. в следующем списке справочной документации.

  • Объединение использует оператор сложения
  • Переменная и подстановка команд соответствуют правилам кавыкания
  • Форматирование использует оператор форматирования
  • Присоединение строк использует оператор соединения и ссылки Join-Path , но вы также можете прочитать о Join-String
  • Массивы документируются в массивах About
  • StringBuilder — это класс .NET с собственной документацией
  • Фигурные скобки в строках также рассматриваются в правилах кворирования
  • Замена маркера использует оператор замены
  • В этом методе $ExecutionContext.InvokeCommand.ExpandString() содержится справочная документация по API .NET

Совместная работа с нами на GitHub

Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.

Практическое руководство. Сцепка нескольких строк (руководство по C#)

Объединение подразумевает добавление одной строки к концу другой. Вы можете сцеплять строки с помощью оператора + . Строковые литералы и константы сцепляются во время компиляции, а не во время выполнения. Строковые переменные сцепляются только во время выполнения.

Примеры C# в этой статье выполняются во встроенном средстве выполнения кода и на площадке Try.NET. Нажмите на кнопку Выполнить, чтобы выполнить пример в интерактивном окне. После выполнения кода вы можете изменить его и выполнить измененный код, снова нажав на кнопку Выполнить. Либо в интерактивном окне выполняется измененный код, либо, если компиляция завершается с ошибкой, в интерактивном окне отображаются все сообщения об ошибках компилятора C#.

Строковые литералы

В следующем примере длинный строковый литерал разделяется на более короткие строки для повышения удобочитаемости исходного кода. Код сцепляет строки меньшего размера для создания длинного строкового литерала. Сегменты сцепляются в одну строку во время компиляции. Количество строк не влияет на производительность во время выполнения.

// Concatenation of literals is performed at compile time, not run time. string text = "Historically, the world of data and the world of objects " + "have not been well integrated. Programmers work in C# or Visual Basic " + "and also in SQL or XQuery. On the one side are concepts such as classes, " + "objects, fields, inheritance, and .NET Framework APIs. On the other side " + "are tables, columns, rows, nodes, and separate languages for dealing with " + "them. Data types often require translation between the two worlds; there are " + "different standard functions. Because the object world has no notion of query, a " + "query can only be represented as a string without compile-time type checking or " + "IntelliSense support in the IDE. Transferring data from SQL tables or XML trees to " + "objects in memory is often tedious and error-prone."; System.Console.WriteLine(text); 

Операторы + и +=

Для сцепки строковых переменных вы можете использовать операторы + или += , интерполяцию строк, а также методы String.Format, String.Concat, String.Join или StringBuilder.Append. Оператор + прост в использовании и позволяет получить интуитивно понятный код. Даже если в одном выражении используется несколько операторов + , содержимое строки копируется только один раз. В следующем коде показаны примеры использования операторов + и += для сцепки строк:

string userName = ""; string dateString = DateTime.Today.ToShortDateString(); // Use the + and += operators for one-time concatenations. string str = "Hello " + userName + ". Today is " + dateString + "."; System.Console.WriteLine(str); str += " How are you today?"; System.Console.WriteLine(str); 

Интерполяция строк

В некоторых выражениях строки проще сцепить с помощью интерполяции, как показано в следующем коде:

string userName = ""; string date = DateTime.Today.ToShortDateString(); // Use string interpolation to concatenate strings. string str = $"Hello . Today is ."; System.Console.WriteLine(str); str = $" How are you today?"; System.Console.WriteLine(str); 

В операциях сцепки строк компилятор C# обрабатывает строки NULL так же, как пустые строки.

Начиная с C# 10, можно использовать интерполяцию строк для инициализации константной строки, если все выражения, используемые для заполнителей, также являются константными строками.

String.Format

Другие методы сцепки строк: String.Format. Этот метод лучше использовать при создании строки из небольшого числа строк-компонентов.

StringBuilder

В других случаях вы можете сцеплять строки во время цикла и не знать, сколько исходных строк вы сцепляете. При этом фактическое число исходных строк может быть большим. Для этих сценариев предназначен класс StringBuilder. В следующем коде для сцепки строк используется метод Append класса StringBuilder.

// Use StringBuilder for concatenation in tight loops. var sb = new System.Text.StringBuilder(); for (int i = 0; i < 20; i++) < sb.AppendLine(i.ToString()); >System.Console.WriteLine(sb.ToString()); 

String.Concat или String.Join

Другой вариант объединения строк из коллекции — использовать метод String.Concat. Используйте метод String.Join, если исходные строки должны быть разделены разделителем. Следующий код объединяет массив слов с помощью обоих методов:

string[] words = < "The", "quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog." >; var unreadablePhrase = string.Concat(words); System.Console.WriteLine(unreadablePhrase); var readablePhrase = string.Join(" ", words); System.Console.WriteLine(readablePhrase); 

LINQ и Enumerable.Aggregate

Другой вариант объединения строк из коллекции — использовать LINQ и метод Enumerable.Aggregate. Этот метод объединяет исходные строки с помощью лямбда-выражения. Лямбда-выражение добавляет каждую строку к существующему накоплению. Следующий пример показывает объединение массива слов с добавлением между словами пробела:

string[] words = < "The", "quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog." >; var phrase = words.Aggregate((partialPhrase, word) =>$" "); System.Console.WriteLine(phrase); 

Этот вариант может потребовать большего числа выделений памяти по сравнению с другими методами сцепки коллекций, так как он создает в каждой итерации промежуточную строку. Если оптимизация производительности имеет решающее значение, рассмотрите StringBuilder String.Concat класс или метод или String.Join для объединения коллекции, а не Enumerable.Aggregate .

См. также

  • String
  • StringBuilder
  • Руководство по программированию на C#
  • Строки

Совместная работа с нами на GitHub

Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.

MNorin.com

Блог про Linux, Bash и другие информационные технологии

Bash-скрипт, содержащий обрабатываемые данные

Давайте на примере простого скрипта рассмотрим, как написать скрипт, хранящий данные внутри самого себя. Это будет список задач, хранимый в том же самом скрипте, который добавляет задачи, удаляет их и выводит список задач в его текущем состоянии. Итоговый скрипт будет за вычетом самого списка задач занимать менее 750 байт. Его удобно использовать, например, с Dropbox’ом, Яндекс.Диском или Copy для синхронизации задач между несколькими компьютерами

Самое первое, что нужно сделать — это определить команды, используемые в скрипте и написать обработку параметров командной строки.

case $1 in add|del|show) ACTION=$1 shift TASK=$@ $_task ;; *) show_help ;; esac

У нас есть три команды: add, del, show. Самое первое, что сделаем — запомним действие, которое указано в командной строке, в переменную ACTION. Затем сдвинем позиционные параметры скрипта, чтобы удалить из этого списка само действие. Переменной TASK приравняем содержимое командной строки, которое в итоге получится. После этого запустим функцию с именем ДЕЙСТВИЕ_task, которая выполняет соответствующее действие. Если же в качестве первого параметра указано что-то иное или ничего не указано, будет вызвана функция show_help, отображающая краткую помощь. Вот она:

show_help()

Теперь создадим функции, необходимые для выполнения указанных действий. Начнем с простого, с вывода списка задач.

show_task()

Эта функция просто выводит всё, что находится между строкой

TASKLISTEND

Именно между этими строками мы и будем хранить список задач. Теперь осталось написать еще две функции: добавление и удаление задачи. Добавлять задачу будем следующим образом:

get_task() < if [ "$TASK" == "" ] then echo -n "Enter task description: " read TASK fi >add_task() < get_task sed -i $0 -re "s/(^TASKLISTEND$)/$TASK\n\1/" $0 show >

Непосредственно добавлением задачи занимается функция add_task, а функция get_task просто запрашивает с клавиатуры задачу, если она не была указана в командной строке. Добавление осуществляется потоковым редактором sed. Он выполняет следующее действие: находит в файле $0 (сам файл скрипта) строку, в которой содержится слово «TASKLISTEND» и вставляет перед ним еще одну строку, содержащую описание задачи, и перевод строки.

Удаление реализуется похожим образом:

del_task()< get_task sed -i $0 -e "/ TASKLISTEND$/,/^TASKLISTEND$/ " $0 show >

Как видите, здесь мы тоже получаем описание задачи при помощи функции get_task, а затем выполняем удаление строки из списка, в которой находится часть описания задачи, попадающей в интервал между двумя строками. Строка начала интервала строк содержит пробел и слово TASKLISTEND в конце строки, а строка конца интервала содержит одно единственное слово TASKLISTEND. Между этими двумя строками мы и удаляем найденную строку, если такая есть.

Вот, собственно, и всё. Полный текст скрипта tsklst.sh:

#!/bin/bash get_task() < if [ "$TASK" == "" ] then echo -n "Enter task description: " read TASK fi >add_task() < get_task sed -i $0 -re "s/(^TASKLISTEND$)/$TASK\n\1/" $0 show >del_task()< get_task sed -i $0 -e "/ TASKLISTEND$/,/^TASKLISTEND$/ " $0 show > show_task() < echo "----------TASK LIST--------" cat show_help() < cat case $1 in add|del|show) ACTION=$1 shift TASK=$@ $_task ;; *) show_help ;; esac

Похожие посты:

  • Как передать параметры в bash-скрипт?
  • Параллельное выполнение в bash
  • Скрипт, который работает и в Linux, и в Windows
  • Генератор паролей на bash
  • Bash. Как обойтись без goto
  • Проверка сертификата сервера из bash
  • Пишем игру 2048 на bash в 2048 байт и меньше
  • Установка программ в Debian при помощи tasksel
  • Система мониторинга на bash'е
  • Использование Яндекс.Диска в Debian/Ubuntu

Полезные методы для строк

Мы рассмотрели базовые понятия, касающиеся строк. Давайте пойдём дальше и рассмотрим, какие полезные операции мы можем выполнять со строками, используя встроенные функции, такие как поиск длины текстовой строки, объединение и разделение строк, замена одного символа из строки другим и многое другое.

Необходимые знания: Базовая компьютерная грамотность, базовое понимание HTML и CSS, понимание того, что такое JavaScript.
Задача: Понять, что строки являются объектами, и изучить, как использовать некоторые из основных методов, доступных для этих объектов для управления строками.

Строки как объекты

Почти всё в JavaScript является объектами. Когда вы создаёте строку, например:

let string = 'This is my string';

ваша переменная становится строковым объектом, и, как результат, ей доступно множество свойств и методов. Можете убедиться в этом, перейдя на страницу String и просмотрев на ней список свойств и методов!

Только не волнуйтесь! Большинство из них вам не нужно знать сейчас на ранней стадии вашего обучения. Но некоторые из них вы, возможно, будете использовать довольно часто. Их мы и рассмотрим.

Введем несколько примеров в консоль разработчика.

Поиск длины строки

Это легко — вы просто используете свойство length . Попробуйте ввести следующие строки:

let browserType = 'mozilla'; browserType.length;

Результатом должно быть число 7, потому что слово «mozilla» состоит из 7 символов. Это свойство можно применить, например, если вы захотите найти длины серии имён, чтобы их можно было отображать по порядку длины или сообщить пользователю, что имя пользователя, которое он ввёл в поле формы, слишком длинное, если оно превышает определённую длину.

Получение определённого строкового символа

Вы можете вернуть любой символ внутри строки, используя обозначение в квадратных скобках. Это означает, что вы добавляете квадратные скобки ([ ]) в конце вашего имени переменной. В квадратных скобках вы указываете номер символа, который хотите вернуть. Например, чтобы получить первую букву, нужно написать:

browserType[0];

Компьютеры считают от 0, а не 1! Чтобы получить последний символ любой строки, мы могли бы использовать следующую строку, объединив эту технику с свойством length :

browserType[browserType.length-1];

Длина слова «mozilla» равна 7, но, поскольку счёт начинается с 0, позиция последнего символа равна 6, поэтому нам нужна length-1 . Такой способ можно использовать, чтобы найти первую букву ряда строк и упорядочить их по алфавиту.

Поиск подстроки внутри строки и её извлечение

  1. Иногда вам может понадобиться выяснить, присутствует ли меньшая строка внутри большей (обычно мы говорим, что внутри строки есть подстрока). Это можно сделать с помощью метода indexOf () , который принимает одну parameter (en-US) - подстроку, которую вы хотите найти. Введите:
browserType.indexOf('zilla');
browserType.indexOf('vanilla');

Это должно дать вам результат -1. Такое значение возвращается, когда подстрока, в данном случае «vanilla», не найдена в основной строке. Вы можете использовать это, чтобы найти все экземпляры строк, которые не содержат подстроку «mozilla» (для обратного эффекта, используйте оператор отрицания):

if(browserType.indexOf('mozilla') === -1) < // сделать что-то, если 'mozilla' // не является частью этой строки >if(browserType.indexOf('mozilla') !== -1) < // сделать что-то, если 'mozilla' // является частью этой строки >
browserType.slice(0,3);
browserType.slice(2);

Примечание: второй параметр slice() не обязателен: если вы его не включите в код, обрезание закончится на конце оригинальной строки. Есть и другие варианты; изучите страницу slice () , чтобы узнать, что ещё вы можете узнать.

Изменение регистра

Строковые методы toLowerCase () и toUpperCase () преобразовывают все символы в строке в нижний или верхний регистр соответственно. Этот способ можно применить, если вы хотите нормализовать все введённые пользователем данные перед их сохранением в базе данных.

Попробуем ввести следующие строки, чтобы узнать, что происходит:

var radData = 'My NaMe Is MuD'; radData.toLowerCase(); radData.toUpperCase();

Обновление частей строки

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

Он принимает два параметра — строку, которую вы хотите заменить, и строку, которую вы хотите вставить вместо заменяемой. Попробуйте этот пример:

browserType.replace('moz','van');

Обратите внимание, что для фактического получения обновлённого значения, отражённого в переменной browserType в реальной программе, вам нужно будет установить значение переменной в результате операции; он не просто обновляет значение подстроки автоматически. Таким образом, вы должны были бы написать это: browserType = browserType.replace('moz','van');

Активные примеры обучения

В этом разделе мы дадим вам попробовать набить руку и вместе напишем код строковой манипуляции. В каждом упражнении ниже у нас есть массив строк и цикл, который обрабатывает каждое значение в массиве и отображает его в маркированном списке. Вам не нужно понимать массивы или циклы прямо сейчас — это будет объяснено в будущих статьях. Все, что вам нужно сделать в каждом случае, — написать код, который выводит строки в том формате, в котором мы предлагаем.

В каждом примере есть кнопка Сбросить, которую вы можете использовать для сброса кода, если вы допустили ошибку и не можете заставить его работать снова, а кнопку Показать решение вы можете нажать, чтобы увидеть потенциальный ответ, если вы действительно застрянете на решении.

Фильтрация приветственных сообщений

В первом упражнении мы начнём с простого: у нас есть множество сообщений поздравительных открыток, но мы хотим отсортировать их, чтобы перечислять только рождественские сообщения. Мы хотим, чтобы вы заполнили условный тест внутри структуры if( . ), чтобы проверить каждую строку и отобразить её в списке, только если это рождественское сообщение.

  1. Сначала подумайте о том, как вы можете проверить, является ли сообщение в каждом случае рождественским сообщением. Какая строка присутствует во всех этих сообщениях и какой метод вы можете использовать для проверки?
  2. Затем вам нужно будет написать условный тест операнд1 оператор операнд2. Соответствует ли результат слева результату справа? Или в этом случае вызов метода слева возвращает результат справа?
  3. Подсказка. В этом случае, вероятно, полезнее проверить, не является ли часть строки не равной (!==) определённому результату.
h2>Результатh2> div class="output" style="min-height: 125px;"> ul>ul> div> h2>Редактируемый кодh2> p class="a11y-label"> Нажмите Esc, чтобы выйти из поля ввода (Tab вставляет символ табуляции). p> textarea id="code" class="playable-code" style="height: 290px; width: 95%"> var list = document.querySelector('.output ul'); list.innerHTML = ''; var greetings = ['С днём рождения!', 'С Рождеством, любовь моя', 'Счастливого Рождества всей твоей семье', 'Ты — та, кто нужен мне на Рождество', 'Поправляйся скорее']; for (var i = 0; i < greetings.length; i++) < var input = greetings[i]; // Ваше решение должно быть в фигурных скобках // ниже: вы должны что-то добавить if (greetings[i]) < var result = input; var listItem = document.createElement('li'); listItem.textContent = result; list.appendChild(listItem); >> textarea> div class="playable-buttons"> input id="reset" type="button" value="Сбросить" /> input id="solution" type="button" value="Показать решение" /> div> 
html  font-family: sans-serif; > h2  font-size: 16px; > .a11y-label  margin: 0; text-align: right; font-size: 0.7rem; width: 98%; > body  margin: 10px; background: #f5f9fa; > 
var textarea = document.getElementById("code"); var reset = document.getElementById("reset"); var solution = document.getElementById("solution"); var code = textarea.value; var userEntry = textarea.value; function updateCode()  eval(textarea.value); > reset.addEventListener("click", function ()  textarea.value = code; userEntry = textarea.value; solutionEntry = jsSolution; solution.value = "Показать решение"; updateCode(); >); solution.addEventListener("click", function ()  if (solution.value === "Показать решение")  textarea.value = solutionEntry; solution.value = "Спрятать решение"; > else  textarea.value = userEntry; solution.value = "Показать решение"; > updateCode(); >); var jsSolution = "var list = document.querySelector('.output ul');\nlist.innerHTML = '';\nvar greetings = ['С днём рождения!',\n 'С Рождеством, любовь моя',\n 'Счастливого Рождества всей твоей семье',\n 'Ты — та, кто нужен мне на Рождество',\n 'Поправляйся скорее'];\n\nfor(var i = 0; i < greetings.length; i++) \n>"; var solutionEntry = jsSolution; textarea.addEventListener("input", updateCode); window.addEventListener("load", updateCode); // stop tab key tabbing out of textarea and // make it write a tab at the caret position instead textarea.onkeydown = function (e)  if (e.keyCode === 9)  e.preventDefault(); insertAtCaret("\t"); > if (e.keyCode === 27)  textarea.blur(); > >; function insertAtCaret(text)  var scrollPos = textarea.scrollTop; var caretPos = textarea.selectionStart; var front = textarea.value.substring(0, caretPos); var back = textarea.value.substring( textarea.selectionEnd, textarea.value.length, ); textarea.value = front + text + back; caretPos = caretPos + text.length; textarea.selectionStart = caretPos; textarea.selectionEnd = caretPos; textarea.focus(); textarea.scrollTop = scrollPos; > // Update the saved userCode every time the user updates the text area code textarea.onkeyup = function ()  // We only want to save the state when the user code is being shown, // not the solution, so that solution is not saved over the user code if (solution.value === "Показать решение")  userEntry = textarea.value; > else  solutionEntry = textarea.value; > updateCode(); >; 

Исправление регистра (размера букв в тексте—прим. пер.)

В этом упражнении у нас есть названия городов в Великобритании, но написанных разным регистром. Мы хотим, чтобы вы изменили их так, чтобы они были в нижнем регистре, за исключением первой буквы. Хороший способ сделать это:

  1. Преобразуйте всю строку, содержащуюся в переменной input, в нижний регистр и сохраните её в новой переменной.
  2. Возьмите первую букву строки в этой новой переменной и сохраните её в другой переменной.
  3. Используя эту последнюю переменную в качестве подстроки, замените первую букву строчной строки первой буквой строчной строки, изменённой на верхний регистр. Сохраните результат этой процедуры замены в другой новой переменной.
  4. Измените значение переменной result на равную конечному результату (не input ).

Примечание: Подсказка — параметры строковых методов не обязательно должны быть строковыми литералами; они также могут быть переменными или даже переменными с вызываемым ими методом.

h2>Результатh2> div class="output" style="min-height: 125px;"> ul>ul> div> h2>Редактируемый кодh2> p class="a11y-label"> Нажмите Esc, чтобы выйти из поля ввода (Tab вставляет символ табуляции). p> textarea id="code" class="playable-code" style="height: 250px; width: 95%"> var list = document.querySelector('.output ul'); list.innerHTML = ''; var cities = ['лонДон', 'МанЧЕСТёр', 'БиРминГЕМ', 'лиВЕРпуЛЬ']; for(var i = 0; i < cities.length; i++) < var input = cities[i]; // пишите код ниже var result = input; var listItem = document.createElement('li'); listItem.textContent = result; list.appendChild(listItem); >textarea> div class="playable-buttons"> input id="reset" type="button" value="Сбросить" /> input id="solution" type="button" value="Показать решение" /> div> 
html  font-family: sans-serif; > h2  font-size: 16px; > .a11y-label  margin: 0; text-align: right; font-size: 0.7rem; width: 98%; > body  margin: 10px; background: #f5f9fa; > 
var textarea = document.getElementById("code"); var reset = document.getElementById("reset"); var solution = document.getElementById("solution"); var code = textarea.value; var userEntry = textarea.value; function updateCode()  eval(textarea.value); > reset.addEventListener("click", function ()  textarea.value = code; userEntry = textarea.value; solutionEntry = jsSolution; solution.value = "Показать решение"; updateCode(); >); solution.addEventListener("click", function ()  if (solution.value === "Показать решение")  textarea.value = solutionEntry; solution.value = "Спрятать решение"; > else  textarea.value = userEntry; solution.value = "Показать решение"; > updateCode(); >); var jsSolution = "var list = document.querySelector('.output ul');\nlist.innerHTML = '';\nvar cities = ['лонДон', 'МанЧЕСТёр', 'БиРминГЕМ', 'лиВЕРпуЛЬ'];\n\nfor(var i = 0; i < cities.length; i++) "; var solutionEntry = jsSolution; textarea.addEventListener("input", updateCode); window.addEventListener("load", updateCode); // stop tab key tabbing out of textarea and // make it write a tab at the caret position instead textarea.onkeydown = function (e)  if (e.keyCode === 9)  e.preventDefault(); insertAtCaret("\t"); > if (e.keyCode === 27)  textarea.blur(); > >; function insertAtCaret(text)  var scrollPos = textarea.scrollTop; var caretPos = textarea.selectionStart; var front = textarea.value.substring(0, caretPos); var back = textarea.value.substring( textarea.selectionEnd, textarea.value.length, ); textarea.value = front + text + back; caretPos = caretPos + text.length; textarea.selectionStart = caretPos; textarea.selectionEnd = caretPos; textarea.focus(); textarea.scrollTop = scrollPos; > // Update the saved userCode every time the user updates the text area code textarea.onkeyup = function ()  // We only want to save the state when the user code is being shown, // not the solution, so that solution is not saved over the user code if (solution.value === "Показать решение")  userEntry = textarea.value; > else  solutionEntry = textarea.value; > updateCode(); >; 

Создание новых строк из старых частей

В этом последнем упражнении массив содержит кучу строк, содержащих информацию о железнодорожных станциях на севере Англии. Строки представляют собой элементы данных, которые содержат трёхбуквенный код станции, за которым следуют некоторые машиночитаемые данные, за которыми следует точка с запятой, а затем название станции, пригодное для чтения человеком. Например:

MAN675847583748sjt567654;Manchester Piccadilly

Мы хотим извлечь код станции и имя и поместить их в строку со следующей структурой:

MAN: Manchester Piccadilly

Мы бы рекомендовали реализовать это следующим образом:

  1. Извлеките трёхбуквенный код станции и сохраните его в новой переменной.
  2. Найдите номер символьного номера точки с запятой.
  3. Извлеките название для чтения человеком, используя номер индекса точки с запятой в качестве контрольной точки и сохраните его в новой переменной.
  4. Объедините две новые переменные и строковый литерал, чтобы сделать финальную строку.
  5. Измените значение переменной result равной конечной строке (не input ).
h2>Результатh2> div class="output" style="min-height: 125px;"> ul>ul> div> h2>Редактируемый кодh2> p class="a11y-label"> Нажмите Esc, чтобы выйти из поля ввода (Tab вставляет символ табуляции). p> textarea id="code" class="playable-code" style="height: 285px; width: 95%"> var list = document.querySelector('.output ul'); list.innerHTML = ''; var stations = ['MAN675847583748sjt567654;Manchester Piccadilly', 'GNF576746573fhdg4737dh4;Greenfield', 'LIV5hg65hd737456236dch46dg4;Liverpool Lime Street', 'SYB4f65hf75f736463;Stalybridge', 'HUD5767ghtyfyr4536dh45dg45dg3;Huddersfield']; for (var i = 0; i < stations.length; i++) < var input = stations[i]; // пишите ваш код ниже var result = input; var listItem = document.createElement('li'); listItem.textContent = result; list.appendChild(listItem); >textarea> div class="playable-buttons"> input id="reset" type="button" value="Сбросить" /> input id="solution" type="button" value="Показать решение" /> div> 
html  font-family: sans-serif; > h2  font-size: 16px; > .a11y-label  margin: 0; text-align: right; font-size: 0.7rem; width: 98%; > body  margin: 10px; background: #f5f9fa; > 
var textarea = document.getElementById("code"); var reset = document.getElementById("reset"); var solution = document.getElementById("solution"); var code = textarea.value; var userEntry = textarea.value; function updateCode()  eval(textarea.value); > reset.addEventListener("click", function ()  textarea.value = code; userEntry = textarea.value; solutionEntry = jsSolution; solution.value = "Показать решение"; updateCode(); >); solution.addEventListener("click", function ()  if (solution.value === "Показать решение")  textarea.value = solutionEntry; solution.value = "Спрятать решение"; > else  textarea.value = userEntry; solution.value = "Показать решение"; > updateCode(); >); var jsSolution = "var list = document.querySelector('.output ul');\nlist.innerHTML = '';\nvar stations = ['MAN675847583748sjt567654;Manchester Piccadilly',\n 'GNF576746573fhdg4737dh4;Greenfield',\n 'LIV5hg65hd737456236dch46dg4;Liverpool Lime Street',\n 'SYB4f65hf75f736463;Stalybridge',\n 'HUD5767ghtyfyr4536dh45dg45dg3;Huddersfield'];\n\nfor(var i = 0; i < stations.length; i++) "; var solutionEntry = jsSolution; textarea.addEventListener("input", updateCode); window.addEventListener("load", updateCode); // stop tab key tabbing out of textarea and // make it write a tab at the caret position instead textarea.onkeydown = function (e)  if (e.keyCode === 9)  e.preventDefault(); insertAtCaret("\t"); > if (e.keyCode === 27)  textarea.blur(); > >; function insertAtCaret(text)  var scrollPos = textarea.scrollTop; var caretPos = textarea.selectionStart; var front = textarea.value.substring(0, caretPos); var back = textarea.value.substring( textarea.selectionEnd, textarea.value.length, ); textarea.value = front + text + back; caretPos = caretPos + text.length; textarea.selectionStart = caretPos; textarea.selectionEnd = caretPos; textarea.focus(); textarea.scrollTop = scrollPos; > // Update the saved userCode every time the user updates the text area code textarea.onkeyup = function ()  // We only want to save the state when the user code is being shown, // not the solution, so that solution is not saved over the user code if (solution.value === "Показать решение")  userEntry = textarea.value; > else  solutionEntry = textarea.value; > updateCode(); >; 

Заключение

Нельзя не согласиться с тем, что способность обрабатывать слова и предложения в программировании очень важна — особенно в JavaScript, поскольку веб-сайты — все связаны с людьми. Эта статья дала вам основы, которые вам нужно знать о манипуляции строками на данный момент. Это пойдёт вам на пользу, когда вы займётесь более сложными темами в будущем. Далее мы рассмотрим последний важный тип данных, на который нам нужно сосредоточиться в краткосрочной перспективе — массивы.

Found a content problem with this page?

  • Edit the page on GitHub.
  • Report the content issue.
  • View the source on GitHub.

This page was last modified on 2 дек. 2023 г. by MDN contributors.

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *