В компьютерном программировании , опираясь зубочистка синдром ( LTS ) является ситуация , в которой цитировал выражение становится нечитаемым , потому что он содержит большое количество экранирующих символов , как правило , обратной косой черты ( «\»), чтобы избежать разделителей столкновения . [1] [2]
Официальная документация Perl [3] ввела этот термин для более широкого использования; там фраза используется для описания регулярных выражений , соответствующих путям в стиле Unix , в которых элементы разделены косой чертой /
. Косая черта также используется в качестве разделителя регулярных выражений по умолчанию, поэтому, чтобы использовать ее буквально в выражении, она должна быть экранирована обратной косой чертой \
, что приводит к частым экранированным косым чертам, представленным как \/
. Если удвоить, как в URL-адресах, это приведет \/\/
к экранированию //
. Аналогичное явление происходит для путей DOS / Windows. , где обратная косая черта используется в качестве разделителя пути, требуя двойной обратной косой черты \\
- это затем может быть повторно экранировано для регулярного выражения внутри экранированной строки, требуя \\\\
сопоставления с одной обратной косой чертой. В крайних случаях, таких как регулярное выражение в экранированной строке, для сопоставления пути Единообразного соглашения об именах (который начинается \\
) требуется 8 обратных косых черт \\\\\\\\
из-за двух обратных косых черт, каждая из которых экранируется дважды.
LTS появляется во многих языках программирования и во многих ситуациях, в том числе в шаблонах, которые соответствуют унифицированным идентификаторам ресурсов (URI), и в программах, которые выводят текст в кавычках. Многие кайны попадают в последнюю категорию.
Пример паттерна [ править ]
Рассмотрим следующее регулярное выражение Perl, предназначенное для сопоставления URI, которые идентифицируют файлы в pub
каталоге FTP- сайта:
м / ftp: \ / \ / [^ \ /] * \ / pub \ //
Perl, как и sed до него, решает эту проблему, позволяя множеству других символов быть разделителями для регулярного выражения. Например, следующие три примера эквивалентны приведенному выше выражению:
м {ftp: // [^ /] * / pub /}m # ftp: // [^ /] * / pub / #m! ftp: // [^ /] * / pub /!
Или этот общий перевод для преобразования обратной косой черты в прямую косую черту:
tr / \\ / \ //
может быть легче понять, если написать так:
tr {\\} {/}
Пример цитируемого текста [ править ]
Программа Perl для печати тега ссылки HTML, где URL-адрес и текст ссылки хранятся в переменных $url
и, $text
соответственно, может выглядеть следующим образом. Обратите внимание на использование обратной косой черты для экранирования двойных кавычек в кавычках:
напечатать "<a href=\"$url\"> $ text </a>" ;
Использование одинарных кавычек для разделения строки невозможно, поскольку Perl не расширяет переменные внутри строк в одинарных кавычках. Например, приведенный ниже код не будет работать должным образом:
напечатать '<a href="$url"> $ text </a>'
Использование printf
функции - жизнеспособное решение для многих языков (Perl, C , PHP ):
printf ( '<a href="%s">% s </a>' , $ url , $ text );
qq
Оператор в Perl позволяет любой разделитель:
напечатать qq {<a href="$url"> $ text </a>} ; print qq | <a href="$url"> $ text </a> | ; напечатать qq (<a href="$url"> $ text </a>) ;
Здесь документы особенно хорошо подходят для многострочных строк; однако здесь документы Perl не допускали правильного отступа до версии v5.26. [4] В этом примере показан синтаксис Perl:
print << HERE_IT_ENDS ; <a href="$url"> $ text </a> HERE_IT_ENDS
Другие языки [ править ]
C # [ править ]
Язык программирования C # обрабатывает LTS с помощью @
символа в начале строковых литералов перед начальными кавычками, например
string filePath = @ "C: \ Foo \ Bar.txt" ;
вместо того, чтобы требовать иначе:
string filePath = "C: \\ Foo \\ Bar.txt" ;
C ++ [ править ]
Стандарт C ++ 11 добавляет необработанные строки :
std :: string filePath = R " ( C: \ Foo \ Bar.txt ) " ;
Если строка содержит символы )"
, можно использовать необязательный разделитель, как d
в следующем примере:
std :: regex re { R " d ( s /" \ ([^ "] * \)" / '\ 1' / g ) d " };
Перейти [ править ]
Go указывает, что строка является необработанной, используя обратную кавычку в качестве разделителя:
s : = `C: \ Foo \ Bar.txt`
Необработанные строки могут содержать любой символ, кроме обратных кавычек; в необработанной строке нет кода выхода для обратной кавычки. Необработанные строки также могут охватывать несколько строк, как в этом примере, где строки s
и t
эквивалентны:
s : = `Строка, занимающая несколько строк.` t : = "Строка, \ n занимающая несколько строк."
Python [ править ]
Python имеет аналогичную конструкцию, использующую r
:
filePath = r "C: \ Foo \ Bar.txt"
Их также можно использовать вместе с тройными кавычками:
example = r "" "Первая строка:" C: \ Foo \ Bar.txt " Вторая строка: ничего" ""
Руби [ править ]
Ruby использует одинарные кавычки для обозначения необработанной строки:
filePath = 'C: \ Foo \ Bar.txt'
Он также имеет литералы процентов регулярных выражений с выбором разделителя, например Perl:
% r {ftp: // [^ /] * / pub /} % r # ftp: // [^ /] * / pub / # % r! ftp: // [^ /] * / pub /!
Ржавчина [ править ]
Rust использует вариант r
префикса: [5]
" \ x52 " ; // R r "\ x52" ; // \ x52 r # "" foo "" # ; // "foo" r ## "foo #" # bar "## ; // foo #" # bar
Литерал начинается с r
любого числа #
, за которым следует один "
. Далее, "
содержащиеся в литерале, считаются частью литерала, если за ними не следует, по крайней мере, столько же, #
сколько используется после открытия r
.
Scala [ править ]
Scala позволяет использовать тройные кавычки, чтобы избежать путаницы:
val filePath = "" "C: \ Foo \ Bar.txt" "" val pubPattern = "" "ftp: // [^ /] * / pub /" "" r
Тройные кавычки также позволяют использовать многострочные строки, как показано здесь:
val text = "" "Первая строка, вторая строка." ""
Сед [ править ]
Регулярные выражения Sed , особенно те, которые используют оператор «s», очень похожи на Perl (sed является предшественником Perl). Разделителем по умолчанию является «/», но можно использовать любой разделитель; по умолчанию используется "s / regexp / replacement /", но "s: regexp: replace:" также является допустимой формой. Например, чтобы сопоставить каталог «pub» (как в примере Perl) и заменить его на «foo», по умолчанию (экранирование косой черты) будет
s / ftp: \ / \ / [^ \ /] * \ / pub \ // foo /
Использование восклицательного знака ("!") В качестве разделителя вместо этого дает
с ! ftp : // [^ /] * / pub / ! фу !
См. Также [ править ]
- Волшебные цитаты
- Строковый литерал
Ссылки [ править ]
- ^ Энди Лестер, Ричард Фоли (2005). Профессиональная отладка Perl . Энди Лестер, Ричард Фоли. п. 176. ISBN. 1-59059-454-1.
- ↑ Дэниел Гольдман (февраль 2013 г.). Полное руководство по sed . EHDP Press. ISBN 978-1-939824-00-4.
- ^ perlop на perldoc.perl.org.
- ^ Здесь документы с отступом
- ^ необработанные байтовые строковые литералы на rust-lang.org.