В компьютерном программировании , интерполяциях строк (или переменной интерполяции , подстановках переменных или переменного расширении ) представляет собой процесс оценки в строке буквальной , содержащие один или несколько заполнителей , что дает результат , в котором заполнители заменены соответствующих их значения. Это форма простой обработки шаблона [1] или, формально, форма квазицитирования (или интерпретации логической подстановки ). Интерполяция строк обеспечивает более простое и интуитивно понятное форматирование строк и спецификацию содержимого по сравнению со строкой.конкатенация . [2]
Интерполяция строк распространена во многих языках программирования, которые интенсивно используют строковые представления данных, таких как Apache Groovy , Kotlin , Perl , PHP , Python , Ruby , Scala , Swift , Tcl и большинство оболочек Unix . Обычно предлагаются два режима литерального выражения: один с включенной интерполяцией, другой без (так называемая необработанная строка ). Заполнители обычно представлены пустой или именованной сигилой (обычно $
или %
), например, $placeholder
или%123
. Расширение строки обычно происходит во время выполнения .
Варианты [ править ]
Некоторые языки не предлагают интерполяцию строк, вместо этого предлагают стандартную функцию, в которой один параметр является строкой формата printf , а другие предоставляют значения для каждого заполнителя.
Ruby использует #
символ для интерполяции и позволяет интерполировать любое выражение, а не только переменные. Другие языки могут поддерживать более продвинутую интерполяцию со специальной функцией форматирования, например printf
, в которой первый аргумент, формат , указывает шаблон, в котором подставляются остальные аргументы.
Алгоритмы [ править ]
Существует два основных типа алгоритмов расширения переменных для интерполяции переменных : [3]
- Заменить и развернуть заполнители : создание новой строки из исходной с помощью операций поиска-замены. Найдите ссылку на переменную (заполнитель), замените ее значением переменной. Этот алгоритм не предлагает стратегии кэширования.
- Разделить и объединить строку : разделение строки на массив и объединение его с соответствующим массивом значений; затем соедините элементы конкатенацией. Разделенную строку можно кэшировать для повторного использования.
Проблемы безопасности [ править ]
Интерполяция строк, как и конкатенация строк, может привести к проблемам с безопасностью. Если вводимые пользователем данные неправильно экранированы или отфильтрованы, система будет подвержена атакам SQL-инъекций , сценариев , XML- инъекций внешних сущностей (XXE) и межсайтовых сценариев (XSS). [4]
Пример SQL-инъекции:
query = " "SELECT x, y, z FROM Table WHERE id='$id'
Если $id
заменить на " "';
, выполнение этого запроса приведет к удалению всех данных в таблице.DELETE FROM Table; SELECT * FROM Table WHERE id='
Примеры [ править ]
Следующий код Perl идентично работает в PHP :
$ name = "Алиса" ; print "$ {name} сказал" Привет, мир толпе ". ;
производит вывод: Alice said Hello World to the crowd of people.
ABAP [ править ]
ДАННЫЕ ( яблоки ) = 4 . НАПИСАТЬ | У меня есть { яблоки } яблок |.
Результатом будет:
У меня 4 яблока
Баш [ править ]
apples = 4 echo "У меня $ apples apples" # или echo "У меня есть $ { apples } яблок"
Результатом будет:
У меня 4 яблока
Бу [ править ]
apples = 4 print ( "У меня есть $ (яблоки) яблоки" ) # или print ( "У меня есть {0} яблоки" % яблоки )
Результатом будет:
У меня 4 яблока
C # [ править ]
вар яблок = 4 ; var bananas = 3 ;Консоль . WriteLine ( $ "У меня есть {яблоки} яблоки" ); Консоль . WriteLine ( $ "У меня есть {яблоки + бананы} фрукты" );
[5]
Результатом будет:
У меня 4 яблокаУ меня 7 фруктов
Язык разметки ColdFusion [ править ]
Синтаксис скрипта языка разметки ColdFusion (CFML):
яблоки = 4 ; writeOutput ( «У меня # яблоки # яблоки» );
Синтаксис тега:
<cfset apples = 4 > <cfoutput> У меня # яблоко # яблоко </cfoutput>
Результатом будет:
У меня 4 яблока
CoffeeScript [ править ]
яблоки = 4 консоли . log "У меня есть # { яблок } яблок"
Результатом будет:
У меня 4 яблока
Дротик [ править ]
int яблок = 4 , бананов = 3 ; print ( 'У меня есть яблоки $ apples.' ); print ( 'У меня есть фрукты $ {яблоки + бананы}.' );
Результатом будет:
У меня 4 яблока.У меня 7 фруктов.
Перейти [ править ]
lang : = Яблоки "Голанг" : = 3 фута . Println ( fmt . Sprintf ( "Я разработчик% s." , Lang )) fmt . Println ( fmt . Sprintf ( "У меня% d яблок." , Яблоки ))
Результатом будет:
Я разработчик Golang.У меня 3 яблока.
Groovy [ править ]
В Groovy интерполированные строки известны как GStrings:
def quality = "superhero" final age = 52 def предложение = "Разработчик - это $ quality, если ему $ {age <= 42?" молодой ":" опытный "}" println предложение
Результатом будет:
Разработчик - супергерой, если он закален
Haxe [ править ]
вар яблок = 4 ; var bananas = 3 ; trace ( 'У меня есть яблоки $ apples.' ); trace ( 'У меня есть фрукты $ { яблоки + бананы } .' );
Результатом будет:
У меня 4 яблока.У меня 7 фруктов.
[6]
Java [ править ]
Не имея истинных интерполированных строк, Java использует вспомогательные функции в качестве временного решения.
В версиях Java 5 и выше String.format
для интерполяции можно использовать статический метод :
int apples = 4 ; int bananas = 3 ; Система . из . println ( String . format ( «У меня есть% s яблоки и% s бананы» , яблоки , бананы )); Система . из . println ( String . format ( «У меня% s фрукт» , яблоки + бананы ));
В Java версии 1.1 и выше MessageFormat
класс может форматировать наборы объектов с помощью заполнителей:
Объект [] testArgs = { Длинный . valueOf ( 3 ), "MyDisk" };MessageFormat form = new MessageFormat ( "Диск \" {1} \ "содержит {0} файла (ов)." );Система . из . Println ( форма . формат ( testArgs ));
JavaScript [ править ]
JavaScript , как и стандарт ECMAScript 2015 (ES6), поддерживает интерполяцию строк с использованием обратных кавычек ``
. Эта функция называется литералами шаблона . [7] Вот пример:
вар яблок = 4 ; var bananas = 3 ; консоль . журнал ( `У меня есть $ { apples } яблоки` ); консоль . журнал ( `У меня $ { яблоки + бананы } фрукты` );
Результатом будет:
У меня 4 яблокаУ меня 7 фруктов
Юлия [ править ]
яблоки = 4 бананов = 3 печати ( « У меня есть $ яблок яблок и $ бананов бананы, делая $ ( яблоки + бананы ) кусочки фруктов в общей сложности.» )
Результатом будет:
У меня 4 яблока и 3 банана, всего получается 7 фруктов.
Котлин [ править ]
val quality = "superhero" val apples = 4 val bananas = 3 val предложение = "Разработчик - это $ quality . У меня есть фрукты $ { apples + bananas } " println ( предложение )
Результатом будет:
Разработчик - супергерой. У меня 7 фруктов
Немерле [ править ]
def яблоки = 4 ; def бананы = 3 ; Консоль . WriteLine ( $ "У меня есть яблоки $ apples." ); Консоль . WriteLine ( $ "У меня есть фрукты $ (яблоки + бананы)." );
Он также поддерживает расширенные функции форматирования, такие как:
def fruit = [ "яблоко" , "банан" ]; Консоль . WriteLine ( $ < # У меня есть .. $ (fruit; "\ n"; f => f + "s") #>);
Результатом будет:
яблокибананы
Оболочка нового поколения [ править ]
Тем не ${expr}
менее, рекомендованный синтаксис $var
также поддерживается:
quality = "superhero" apples = 4 банана = 3 предложения = "Разработчик - это $ quality . У меня есть фрукты $ { apples + bananas } "
echo ( предложение )
Результатом будет:
Разработчик - супергерой. У меня 7 фруктов
Ним [ править ]
Nim обеспечивает интерполяцию строк через модуль Strutils. Форматированные строковые литералы, вдохновленные F-строкой Python, предоставляются через модуль strformat, макрос strformat проверяет, правильно ли сформирована и типизирована строка форматирования, а затем расширяется в исходный код Nim во время компиляции.
import Strutils , strformat var apples = 4 var bananas = 3 echo "У меня есть яблоки за 1 доллар " . format ( яблоки ) echo fmt "У меня есть {яблоки} яблоки" echo fmt "У меня есть {яблоки + бананы} фрукты"# Многострочный echo fmt " " "У меня есть { яблоки } яблоки" ""# Отладка форматирования echo fmt "У меня есть {apples =} яблоки"# Пользовательские символы openChar и closeChar echo fmt ( "У меня есть (яблоки) {яблоки}" , '(' , ')' )# Обратная косая черта внутри форматированного строкового литерала echo fmt " " " {" yep \ nope "} " " "
Результатом будет:
У меня 4 яблокаУ меня 4 яблокаУ меня 7 фруктову меня есть4 яблокаУ меня яблоки = 4 яблокаУ меня 4 {яблока}Агаопе
ParaSail [ править ]
const Яблоки : = 4 const Бананы : = 3 Println ( "У меня есть` (Яблоки) яблоки. \ n " ) Println ( " У меня есть фрукты (Яблоки + Бананы). \ n " )
Результатом будет:
У меня 4 яблока.У меня 7 фруктов.
Perl [ править ]
мои яблоки = 4 ; мои бананы $ = 3 ; print "У меня есть яблоки $ apples. \ n" ; print "У меня есть фрукты @ {[$ apples + $ bananas]}. \ n" ; # Использует интерполяцию массива Perl (@).
Результатом будет:
У меня 4 яблока.У меня 7 фруктов.
PHP [ править ]
<? php $ apples = 5 ; бананы = 3 ; echo "Есть $ яблоки яблоки и $ бананы бананы." ; эхо " \ п " ; echo "У меня есть яблоки $ { apples } и бананы $ { bananas } ." ;
Результатом будет:
Есть 5 яблок и 3 банана.У меня 5 яблок и 3 банана.
Python [ править ]
# во всех версиях apples = 4 банана = 3 print ( "У меня % d яблок и % d бананов" % ( яблоки , бананы )) # больше не рекомендуется print ( "У меня есть % (яблоки) d яблок и % (бананы) d bananas " % locals ()) # больше не рекомендуется # с Python 2.6+ print ( " У меня есть {0} яблоки и {1} бананы " . format ( apples, bananas )) print ( "У меня есть {a} яблоки и {b} бананы" . format ( b = bananas , a = apples )) # с Python 2.7+ print ( "У меня есть {} яблоки и {} бананы" . format ( яблоки , бананы )) # или с Python 3.6+ print ( f "У меня есть { яблоки } яблоки и { бананы }бананы " )
[8] [9]
Результатом будет:
У меня 4 яблока и 3 банана
Рубин / Кристалл [ править ]
apples = 4 помещает "У меня # { apples } яблок" # или помещает "У меня есть% s яблоки" % apples # или помещает "У меня есть% {a} яблоки" % { a : apples }
Результатом будет:
У меня 4 яблока
Ржавчина [ править ]
Не имея истинных интерполированных строк, Rust предоставляет обходной путь через модуль std :: fmt , с которым взаимодействуют различные макросы, такие как format! , Запись! , и распечатайте! . Эти макросы преобразуются в исходный код Rust во время компиляции, при этом каждый аргумент взаимодействует с модулем форматирования . Средство форматирования поддерживает позиционные параметры , именованные параметры , типы аргументов и определение различных характеристик форматирования .
let ( яблоки , бананы ) = ( 4 , 3 ); println! ( "Есть {} яблоки и {} бананы." , Яблоки , бананы );
Результатом будет:
Есть 4 яблока и 3 банана.
Scala [ править ]
В Scala 2.10+ реализованы следующие строковые интерполяторы: s, f и raw. Также можно написать собственные или заменить стандартные.
Интерполятор f - это макрос компилятора, который перезаписывает строку формата со встроенными выражениями как вызов String.format. Он проверяет, правильно ли сформирована и типизирована строка формата.
Стандартные интерполяторы [ править ]
Интерполяция строк в Scala 2.10+ позволяет встраивать ссылки на переменные непосредственно в обработанные строковые литералы. Вот пример:
val apples = 4 val bananas = 3 // до Scala 2.10 printf ( "У меня% d яблок \ n" , яблоки ) println ( "У меня% d яблоки" формат яблок ) // Scala 2.10+ println ( s "У меня есть $ apples apples " ) println ( s" У меня $ { apples + bananas } фрукты " ) println ( f" У меня есть $ apples % d apples " )
Результатом будет:
У меня 4 яблока
Sciter (текст) [ править ]
В Sciter любая функция с именем, начинающимся с $, считается интерполирующей функцией, поэтому интерполяция настраивается и зависит от контекста:
вар яблок = 4 вар бананов = 3 вар domElement = ...;domElement . $ content ( < p > у меня есть { apples } яблоки < / p>); domElement . $ append ( < p > У меня есть { яблоки + бананы } фрукты < / p>);
Где
domElement. $ content (<p> У меня есть {яблоки} яблок </p>);
компилируется в это:
domElement . html = "<p> У меня есть" + яблоки . toHtmlString () + «яблоки </p>» ;
Снобол [ править ]
яблоки = 4 ; bananas = 3 Output = "У меня" яблоки "яблоки." Вывод = «У меня» ( яблоки + бананы ) «фрукты».
Результатом будет:
У меня 4 яблока.У меня 7 фруктов.
Swift [ править ]
В Swift новое значение String можно создать из смеси констант, переменных, литералов и выражений, включив их значения в строковый литерал. Каждый элемент, вставленный в строковый литерал, заключен в пару круглых скобок с префиксом обратной косой черты.
let apples = 4 print ( "У меня \ (яблоки) яблоки" )
Результатом будет:
У меня 4 яблока
Tcl [ править ]
Язык команд инструментов всегда поддерживал интерполяцию строк во всех строках, разделенных кавычками.
набор яблок 4 ставит "у меня $ яблоки яблоки".
Результатом будет:
У меня 4 яблока.
Чтобы фактически отформатировать, а не просто заменить значения, существует функция форматирования.
набор яблок 4 ставка [ формат «У меня% d яблок.» $ apples ]
TypeScript [ править ]
Начиная с версии 1.4 TypeScript поддерживает интерполяцию строк с использованием обратных кавычек ``
. Вот пример:
вар яблок : число = 4 ; консоль . журнал ( `У меня есть $ { apples } яблоки` );
Результатом будет:
У меня 4 яблока
console.log
Функция может быть использована в качестве printf
функции. Приведенный выше пример можно переписать следующим образом:
вар яблок : число = 4 ; консоль . журнал ( "У меня% d яблок" , яблоки );
Результат остается прежним.
Visual Basic [ править ]
Начиная с Visual Basic 14, в Visual Basic поддерживается строковая интерполяция.
name = "Tom" Консоль . WriteLine ( $ "Привет, {имя}" )
напечатает «Привет, Том».
См. Также [ править ]
- Конкатенация
- Неправильная проверка ввода
- строка формата printf
- Квази-цитата
- Строковый литерал
- Замена
Заметки [ править ]
- ^ " Обеспечение строгого разделения представления модели и представления в механизмах шаблонов ", Т. Парр (2004), конференция WWW2004.
- ^ http://perlmeme.org/howtos/using_perl/interpolation.html
- ^ "Система наименьших-шаблонов / Простейшие алгоритмы" , онлайн-руководство для систем шаблонов-заполнителей.
- ^ http://google-caja.googlecode.com/svn/changes/mikesamuel/string-interpolation-29-Jan-2008/trunk/src/js/com/google/caja/interp/index.html#-autogen- id-1 Архивировано 19 октября 2012 г. в Wayback Machine.
- ^ https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/strings/#string-interpolation
- ^ «Haxe - Руководство - Строковая интерполяция» . Haxe - кроссплатформенный инструментарий . Проверено 12 сентября 2017 .
- ^ https://developer.mozilla.org/docs/Web/JavaScript/Reference/Template_literals
- ^ https://docs.python.org/3/whatsnew/3.0.html
- ^ https://www.python.org/dev/peps/pep-0498/