コンピュータプログラミングにおいて、傾斜つまようじ症候群(LTS )とは、区切り文字の衝突を避けるために、引用符で囲まれた式に大量のエスケープ文字(通常はバックスラッシュ("\"))が含まれるために判読不能になる状況を指します。[1] [2]
公式Perlドキュメント[3]では、この用語がより広い用法で使われるようになりました。そこでは、このフレーズは、要素がスラッシュ で区切られているUnixスタイルのパスと一致する正規表現を説明するために使われています。スラッシュは、デフォルトの正規表現の区切り文字としても使われているため、式の中で文字通り使用するには、バックスラッシュ でエスケープする必要があり、 として表されるエスケープされたスラッシュが頻繁に使用されます。URL などでスラッシュを 2 つ使用すると、エスケープされたになります。同様の現象がDOS / Windows のパスでも発生します。DOS / Windows のパスでは、バックスラッシュがパスの区切り文字として使われ、2 つのバックスラッシュが必要になります。その後、エスケープされた文字列内の正規表現でこれを再度エスケープして、 1 つのバックスラッシュと一致させる必要があります。エスケープされた文字列内の正規表現などの極端なケースでは、で始まるUniform Naming Conventionパスとの一致には、 2 つのバックスラッシュがそれぞれ二重にエスケープされるため、
8 つのバックスラッシュが必要になります。/\\/\/\/// \\\\\\\\\\\\\\\\
LTS は、 Uniform Resource Identifiers (URI) に一致するパターンや引用符で囲まれたテキストを出力するプログラムなど、多くのプログラミング言語やさまざまな状況で使用されます。多くのクインは後者のカテゴリに分類されます。
パターン例
FTPpubサイトのディレクトリ下のファイルを識別する URI と一致することを目的とした次の Perl 正規表現を検討してください。
m / ftp:\/\/[^\/]*\/pub\/ /
Perl は、以前のsedと同様に、他の多くの文字を正規表現の区切り文字として使用できることにより、この問題を解決します。たとえば、次の 3 つの例は、上記の式と同等です。
m{ftp://[^/]*/pub/}
m#ftp://[^/]*/pub/#
m!ftp://[^/]*/pub/!
または、バックスラッシュをスラッシュに変換する一般的な翻訳は次のとおりです。
tr /\\/ \ //
次のように書くと理解しやすくなるかもしれません:
tr { \\ }{ / }
引用文の例
URL とリンク テキストがそれぞれ変数とに格納されている HTML リンク タグを出力する Perl プログラムは$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 );
Perl の演算子qqでは任意の区切り文字を使用できます。
qq{<a href="$url">$text</a>}を印刷します。qq |<a href="$url">$text</a>| を印刷します。qq (<a href="$url">$text</a>) を印刷します。
ヒアドキュメントは複数行の文字列に特に適していますが、Perlのヒアドキュメントではバージョン5.26より前は適切なインデントが許可されていませんでした。[4]次の例はPerlの構文を示しています。
印刷<< HERE_IT_ENDS ; <a href="$url">$text</a> HERE_IT_ENDS
その他の言語
C#
C #@プログラミング言語は、文字列リテラルの先頭の引用符の前にあるシンボル
を使用してLTSを処理します。例:
文字列ファイルパス= @"C:\Foo\Bar.txt" ;
代わりに、次のことを要求する:
文字列ファイルパス= "C:\\Foo\\Bar.txt" ;
C++
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 := "複数行にまたがる文字列。"
パイソン
Python には、を使用した同様の構造がありますr。
ファイルパス = r "C:\Foo\Bar.txt"
三重引用符と一緒に使用することもできます。
example = r """最初の行: "C:\Foo\Bar.txt"
2行目: なし"""
R
R にrは、Rさまざまな括弧区切り文字 ( (、、[)を使用した同様の構造があります{。
ファイルパス<- r "(C:\Foo\Bar.txt)"
(インスタンスを
含む生の文字列の場合
文字列<- r "{括弧付きのテキスト}"
柔軟性を高めるために、終了区切り文字と終了引用符の間に同じ数のダッシュが表示される限り、開始引用符と開始区切り文字の間に複数のダッシュを配置できます。
ルビー
Ruby では、生の文字列を示すために一重引用符を使用します。
ファイルパス= '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任意の数の が続き#、その後に 1 つの が続きます"。リテラルにさらに含まれる は、開始 の後に使用される"数以上が続かない限り、リテラルの一部とみなされます。したがって、 で始まる文字列リテラルのコンテンツには
を含めることはできません。#rr#""#
スカラ
Scala では、混乱を避けるために三重引用符の使用が許可されています。
val filePath = """C:\Foo\Bar.txt""" val pubPattern = """ftp://[^/]*/pub/""" r
三重引用符を使用すると、次に示すように複数行の文字列も可能になります。
val text = """1行目、2行目。"""
セド
sed正規表現、特に「s」演算子を使用するものは、Perl と非常によく似ています (sed は Perl の前身です)。デフォルトの区切り文字は「/」ですが、任意の区切り文字を使用できます。デフォルトは ですが、これも有効な形式です。たとえば、Perl の例のように「pub」ディレクトリに一致し、それを「foo」に置き換える場合、デフォルト (スラッシュをエスケープ) は次のようになります。
s/regexp/replacement/s:regexp:replacement:
s / ftp:\/\/[^\/]*\/pub\/ / foo /
代わりに感嘆符(「!」)を区切り文字として使用すると、
s ! ftp://[^/]*/pub/ ! foo !
