つまようじもたれ症候群

フリー百科事典ウィキペディアより
ナビゲーションにジャンプ 検索にジャンプ

コンピューター プログラミングでは爪楊枝傾倒症候群( LTS ) とは、引用符で囲まれた式が、区切り文字の衝突を避けるために通常はバックスラッシュ("\") であるエスケープ文字が多数含まれているために、読み取れなくなる状況です。[1] [2]

公式のPerlドキュメント[3]は、この用語をより広い用途に導入しました。そこでは、要素がスラッシュで区切られたUnixスタイルのパスに一致する正規表現を記述するためにこの句が使用されますスラッシュはデフォルトの正規表現区切り文字としても使用されるため、式で文字通り使用するには、バックスラッシュ でエスケープする必要がありますURL のように 2 重にすると、エスケープされた. DOS / Windowsパスでも同様の現象が発生/\\/\/\/// 、ここでバックスラッシュはパスの区切り文字として使用され、バックスラッシュが 2 つ必要です。これは、エスケープされた文字列内の正規表現用に\\エスケープでき、単一のバックスラッシュと一致する必要があります。エスケープされた文字列内の正規表現などの極端な場合、Uniform Naming Conventionパス ( で始まる) に一致するには、2 つのバックスラッシュがそれぞれ二重エスケープされるため、 8 つのバックスラッシュが必要です。\\\\\\\\\\\\\\

LTS は、 Uniform Resource Identifier (URI) に一致するパターンや引用テキストを出力するプログラムなど、多くのプログラミング言語やさまざまな状況で使用されます。多くのクワインは後者のカテゴリーに分類されます。

パターン例

FTPサイト のpubディレクトリの下にあるファイルを識別する URI に一致することを目的とした、次の Perl 正規表現を検討してください。

m/ftp:\/\/[^\/]*\/パブ\//

Perl は、それ以前のsedと同様に、他の多くの文字を正規表現の区切り文字にできるようにすることで、この問題を解決しています。たとえば、次の 3 つの例は、上記の式と同等です。

m{ftp://[^/]*/pub/}
m#ftp://[^/]*/pub/#
m!ftp://[^/]*/pub/!

または、バックスラッシュをスラッシュに変換するこの一般的な変換:

tr/\\/\//

次のように書くと理解しやすいかもしれません。

トレ{\\}{/}

引用テキストの例

$urlURL とリンク テキストがそれぞれ変数とに格納されている HTML リンク タグを出力する Perl プログラムは、次の$textようになります。二重引用符で囲まれた文字をエスケープするためにバックスラッシュを使用していることに注意してください。

print  "<a href=\"$url\">$text</a>" ;

Perl は単一引用符で囲まれた文字列内の変数を展開しないため、単一引用符を使用して文字列を区切ることはできません。たとえば、次のコードは意図したとおりに機能し ません。

print  '<a href="$url">$text</a>'

printf関数を使用することは、多くの言語 (Perl、CPHP ) で実行可能なソリューションです。

printf ( '<a href="%s">%s</a>' ,  $url ,  $text );

Perlのqq演算子では、任意の区切り文字を使用できます。

print  qq{<a href="$url">$text</a>} ; 
print  qq|<a href="$url">$text</a>| ; 
print  qq(<a href="$url">$text</a>) ;

ヒアドキュメントは、複数行の文字列に特に適しています。ただし、Perl here ドキュメントでは、v5.26 より前では適切なインデントが許可されていませんでした。[4]この例は、Perl の構文を示しています。

印刷 << 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`

生の文字列には、バッククォート以外の任意の文字を含めることができます。生の文字列にはバッククォートのエスケープ コードはありません。次の例のように、生の文字列は複数の行にまたがる場合があります。ここで、文字列stは同等です。

s  :=  `複数の行
にまたがる文字列
。` 
t  :=  "複数の行にまたがる\n文字列。"

パイソン

Pythonには、以下を使用した同様の構造がありますr

filePath  =  r "C:\Foo\Bar.txt"

三重引用符と一緒に使用することもできます。

example  =  r """1 行目: "C:\Foo\Bar.txt" 
2 行目: なし"""

ルビー

Rubyでは、一重引用符を使用して生の文字列を示します。

filePath  =  'C:\Foo\Bar.txt'

また、Perl のような区切り文字を選択できる正規表現のパーセント リテラルもあります。

%r{ftp://[^/]*/pub/} 
%r#ftp://[^/]*/pub/# 
%r!ftp://[^/]*/pub/!

さび

Rustrは接頭辞のバリアントを使用します: [5]

" \x52 " ; // R r"\x52" ; // \x52 r#""foo""# ; // "foo" r##"foo #"# バー"## ; // foo #"# バー               
              
           
   

リテラルは で始まり、rその後に任意の数の#が続き、その後に 1 つが続き"ます。リテラルにさらに"含まれているものは、リテラルの一部と見なされ#ますr

スカラ

Scalaでは、混乱を避けるために三重引用符を使用できます。

val  filePath  =  """C:\Foo\Bar.txt""" 
val  pubPattern  =  """ftp://[^/]*/pub/""" r

次に示すように、三重引用符を使用すると、複数行の文字列も使用できます。

val  text  =  """1 行目、
2 行目。"""

セド

sedの正規表現、特に「s」演算子を使用するものは、Perl によく似ています (sed は Perl の前身です)。デフォルトの区切り文字は「/」ですが、任意の区切り文字を使用できます。デフォルトは「s/regexp/replacement/」ですが、「s:regexp:replacement:」も有効な形式です。たとえば、(Perl の例のように) "pub" ディレクトリに一致させ、それを "foo" に置き換える場合、デフォルト (スラッシュをエスケープ) は次のようになります。

s/ftp:\/\/[^\/]*\/pub\//foo/

代わりに感嘆符 ("!") を区切り文字として使用すると、

_ ftp : // [^/] * /pub/ ! ふー

も参照

参考文献

  1. ^ アンディ・レスター、リチャード・フォーリー (2005). プロ Perl デバッグ. アンディ・レスター、リチャード・フォーリー。p。176.ISBN _ 1-59059-454-1.
  2. ^ ダニエル・ゴールドマン (2013 年 2 月). sed の決定版ガイドEHDPプレス。ISBN 978-1-939824-00-4.
  3. ^ perldoc.perl.orgの perlop。
  4. ^ Indented Here ドキュメント
  5. ^ rust-lang.orgの未加工のバイト文字列リテラル。