Из Википедии, свободной энциклопедии
Перейти к навигации Перейти к поиску

В компьютерном программировании , опираясь зубочистка синдром ( 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 / ! фу !

См. Также [ править ]

  • Волшебные цитаты
  • Строковый литерал

Ссылки [ править ]

  1. ^ Энди Лестер, Ричард Фоли (2005). Профессиональная отладка Perl . Энди Лестер, Ричард Фоли. п. 176. ISBN. 1-59059-454-1.
  2. Дэниел Гольдман (февраль 2013 г.). Полное руководство по sed . EHDP Press. ISBN 978-1-939824-00-4.
  3. ^ perlop на perldoc.perl.org.
  4. ^ Здесь документы с отступом
  5. ^ необработанные байтовые строковые литералы на rust-lang.org.