Lieger Zahnstocher -Syndrom

Im Computerprogrammierung, Lieger Zahnstocher -Syndrom (Lts) ist die Situation, in der ein zitierter Ausdruck unlesbar wird, weil er eine große Anzahl von enthält Flucht Charaktere, normalerweise Backslashes ("\"), vermeiden Grenzkollision.[1][2]

Das offizielle Perl Dokumentation[3] stellte den Begriff in eine breitere Verwendung ein; Dort wird der Satz verwendet, um zu beschreiben Reguläre Ausdrücke Das Match Unix-Stilwege, in denen die Elemente durch Schrägstriche getrennt sind /. Der Schrägstrich wird auch als standardmäßiger regulärer Ausdrucksgrenzwert verwendet. Um wörtlich im Ausdruck zu verwenden, muss er mit a entkommen werden der RückenSchrägstrich \, was zu häufig entkommenen Schrägstrichen führt als als \/. Wenn dies wie bei URLs verdoppelt wird, ergibt dies dies \/\/ für einen entkommenen //. Ein ähnliches Phänomen tritt auf DOS/Fenster Wege, wo der Backslash als Pfadabscheider verwendet wird und einen doppelten Backslash erfordert \\ - Dies kann dann sein betreffend-Es entsandt für einen regulären Ausdruck in einer entkommenen Schnur, die erfordert \\\\ zu einem einzelnen Backslash passt. In extremen Fällen, wie z. Einheitliche Namenskonvention Weg (der beginnt \\) Erfordert 8 Backslashes \\\\\\\\ Aufgrund von 2 Backslashes, die jeweils doppelt gelten.

LTS erscheint in vielen Programmiersprachen und in vielen Situationen, einschließlich in Mustern, die übereinstimmen Einheitliche Ressourcenidentifikatoren (URIS) und in Programmen, die zitierter Text ausgegeben haben. Viele Quinien fallen in die letztere Kategorie.

Musterbeispiel

Betrachten Sie den folgenden regelmäßigen Perl -Ausdruck, der URIs übereinstimmen soll, die Dateien unter dem identifizieren Pub Verzeichnis von an Ftp Seite? ˅:

m/ftp: \/\/[^\/]*\/pub \ //

Perl wie sed Löst dieses Problem vorher, indem es vielen anderen Charakteren erlaubt, Grenzwerte für einen regulären Ausdruck zu sein. Beispielsweise entsprechen die folgenden drei Beispiele dem oben angegebenen Ausdruck:

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

Oder diese gemeinsame Übersetzung zum Umwandeln von Backslashes, um Schrägstriche weiterzuleiten:

Tr/\\/\ //

kann einfacher zu verstehen sein, wenn es so geschrieben wird:

Tr {\\} {/}

Zitiertes Textbeispiel

Ein Perl -Programm zum Drucken eines HTML -Link -Tags, bei dem die URL- und Link -Text in Variablen gespeichert ist $ url und $ Text Könnte so aussehen. Beachten Sie die Verwendung von Backslashes, um den zitierten Doppel-Zitat-Zeichen zu entkommen:

drucken "<a href=\"$url\"> $ Text </a>"; 

Die Verwendung von einzelnen Zitaten zum Abgrenzung der Zeichenfolge ist nicht machbar, da Perl Variablen in einzelnen zitierten Zeichenfolgen nicht erweitert. Der nachstehende Code würde zum Beispiel würden nicht Arbeiten wie vorgesehen:

drucken "<a href="$url"> $ Text </a>" 

Verwendung der printf Funktion ist eine praktikable Lösung in vielen Sprachen (Perl, C, Php):

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

Das QQ Der Bediener in Perl ermöglicht jeden Trennzeichen:

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

Hier Dokumente sind besonders gut für Multi-Line-Saiten geeignet; Perl hier hatten Dokumente jedoch nicht angemessen zugelassen Vertiefung vor v5.26.[4] Dieses Beispiel zeigt die Perl -Syntax:

drucken <<Hier_it_ends; $text Hier_it_ends 

Andere Sprachen

C#

Das C# Programmiersprache verhandelt LTS mit der Verwendung der @ Symbol zu Beginn von String -Literalen vor den ersten Anführungszeichen, z.

Saite Dateipfad = @"C: \ foo \ bar.txt"; 

eher als sonst erforderlich:

Saite Dateipfad = "C: \\ foo \\ bar.txt"; 

C ++

Das C ++ 11 Standard fügt hinzu rohe Saiten:

std::Saite Dateipfad = R"(C: \ foo \ bar.txt)"; 

Wenn die Zeichenfolge die Zeichen enthält ) ", ein optionaler Trennzeichen kann verwendet werden, wie z. d Im folgenden Beispiel:

std::Regex betreffend{ R"d(s/"\ ([^"]*\) "/'\ 1'/g)d" }; 

gehen

gehen Zeigt an, dass eine Zeichenfolge durch Verwendung der RAW ist Backtick als Trennzeichen:

s : = `C: \ foo \ bar.txt` 

Rohe Saiten können jeden Charakter außer Backticks enthalten; Es gibt keinen Fluchtcode für einen Backtick in einer rohen Zeichenfolge. Rohe Saiten können auch mehrere Zeilen umfassen, wie in diesem Beispiel, wo die Saiten s und t sind äquivalent:

s : = `Eine Zeichenfolge, die erstreckt sich über mehrere Linien.` t : = "Eine Zeichenfolge, die mehrere \ nlines \ nSpans endet." 

Python

Python hat ein ähnliches Konstrukt verwendet r:

Dateipfad = r"C: \ foo \ bar.txt" 

Man kann sie auch zusammen mit dreifachen Zitaten verwenden:

Beispiel = r"" Erste Zeile: "C: \ foo \ bar.txt" Zweite Zeile: Nichts "" "" 

Rubin

Rubin Verwendet ein einzelnes Zitat, um eine rohe Zeichenfolge anzuzeigen:

Dateipfad = 'C: \ foo \ bar.txt' 

Es hat auch Regex -Prozent -Literale mit Auswahl des Trennzeichens wie Perl:

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

Rost

Rost verwendet eine Variante der r Präfix:[5]

"\ x52";  // R r "\ x52";  // \ x52 r#"" foo ""#;  // "foo" r ## "foo#"#bar "##;  // Foo # " # Bar 

Der wörtliche beginnt mit r gefolgt von einer beliebigen Anzahl von #, gefolgt von einem ". Des Weiteren " im wörtlichen Literal enthalten gelten als Teil des wörtlichen # wie nach der Öffnung verwendet r.

Scala

Scala Ermöglicht die Verwendung von dreifachen Zitaten, um zu verhindern, dass die Verwirrung entkommt:

val Dateipfad = "" C: \ foo \ bar.txt "" " val Pubpattern = "" "ftp: // [^/]*/pub/" ""r 

Die dreifachen Zitate ermöglichen auch Multiline -Zeichenfolgen, wie hier gezeigt:

val Text = """Erste Linie, zweite Reihe.""" 

Sed

Sed Regelmäßige Ausdrücke, insbesondere solche, die den "S" -Portler verwenden, ähneln Perl sehr (SED ist ein Vorgänger von Perl). Der Standard -Trennzeichen ist "/", aber jeder Trennzeichen kann verwendet werden. Die Standardeinstellung ist "s/regexp/Ersatz/", aber "S: Regexp: Ersatz:" ist auch ein gültiges Formular. Um beispielsweise einem "Pub" -Verzeichnis (wie im Perl -Beispiel) zu entsprechen und es durch "Foo" zu ersetzen, ist die Standardeinstellung (entkommen der Schrägstriche)

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

Verwenden eines Ausrufespunkts ("!") Als Trennzeichen stattdessen ergibt

s!ftp://[^/]*/pub/!Foo! 

Siehe auch

Verweise

  1. ^ Andy Lester, Richard Foley (2005). Pro Perl -Debugging. Andy Lester, Richard Foley. p. 176. ISBN 1-59059-454-1.
  2. ^ Daniel Goldman (Februar 2013). Endgültige Anleitung zu SED. EHDP Press. ISBN 978-1-939824-00-4.
  3. ^ Perlop bei penldoc.perl.org.
  4. ^ Hier eingereicht. Dokumente
  5. ^ rohe Byte -String -Literale bei Rust-Lang.org.