9 Stimmen

Gibt es einen regulären Ausdruck, um einen nachgestellten Schrägstrich in Perl zu entfernen?

Ich möchte einen nachgestellten Schrägstrich aus einer Zeichenkette entfernen. Wenn ich zum Beispiel eine Zeichenkette habe, die $test = "test/". Wie würde ich den Schrägstrich am Ende entfernen?

1 Stimmen

Haben Sie die Dokumentation gelesen? überhaupt ? z.B. perldoc.perl.org/perreftut.html ?

12voto

miorel Punkte 1853

Mit einem regulären Ausdruck tun: $test =~ s/\/$//

Wenn Sie sicher sind, dass das letzte Zeichen ein Schrägstrich sein wird, können Sie alternativ die Option Kotelett Funktion: chop $test

1 Stimmen

Verwenden Sie die \z Anker, um das absolute Ende der Zeichenkette zu erhalten.

1 Stimmen

Entschuldigen Sie die Störung, aber es scheint, dass diese Regex für alle Verzeichnisse funktioniert, außer bei Verwendung von "Stammverzeichnis "* --> / <--. Es wird einfach der Root-Pfad entfernt, was in manchen Fällen nicht so gut ist, weil er mit einem abschließenden Schrägstrich beginnt (Paradoxon?). ;-)

8voto

codaddict Punkte 426877

Wenn Sie sich sicher sind, dass immer ein / am Ende steht, können Sie die Funktion "Chop" verwenden:

$test = "test/";
$test = chop($test);

Wenn Sie sich nicht sicher sind, was Sie tun können:

$test = "test/";
$test = $1 if($test=~/(.*)\/$/);

0 Stimmen

Unnötige Verwendung von Capturing Group, und wenn die Zeichenkette neue Zeilen enthält, bricht sie ebenfalls ab.

2 Stimmen

Wow, diese beiden Beispiele sind falsch. Sie müssen prüfen, ob das letzte Zeichen ein / ist, wenn Sie chop verwenden, und der Anker $ erlaubt einen Zeilenumbruch nach dem letzten Zeichen. Verwenden Sie anstelle einer Übereinstimmung einfach eine Ersetzung: s|/\z||;

8voto

Eugene Yarmash Punkte 130008

Sie können die s/// Substitutionsoperator:

$test =~ s{/\z}{};

1 Stimmen

Verwenden Sie die \z Anker, um das absolute Ende der Zeichenkette zu erhalten.

8voto

justintime Punkte 3581

Ich persönlich würde dies umformulieren, um die Vermischung von "\" und "/" zu vermeiden.

$test =~ s|/$||

Wenn Sie "|" verwenden, müssen Sie das "/" nicht in Anführungszeichen setzen.

1 Stimmen

Verwenden Sie die \z Anker, um das absolute Ende der Zeichenkette zu erhalten.

0voto

Oliver Jones Punkte 229

Dieses Snippet kümmert sich um abschließende Schrägstriche, außer für das Root-Verzeichnis:

#!/usr/bin/perl

my $test = './';
$test =~ s{(.+)/\z}{\1};
print $test."\n";

Das funktioniert folgendermaßen:

Der erste Teil des regulären Ausdrucks - s{(.+)/ \z } - definiert eine Gruppe in den Klammern () . Hierauf verweist die \1 im zweiten Teil des regulären Ausdrucks - { \1 } . Innerhalb dieser Gruppe habe ich ein oder mehrere Zeichen definiert - .+ - unmittelbar gefolgt von einem Schrägstrich, gefolgt von dem absoluten Ende der Zeichenkette - \z .

Der reguläre Ausdruck speichert alles innerhalb der Klammern, um später als \1 in der Ersatzspezifikation (im Wesentlichen der zweite Teil).

Dies funktioniert sehr ähnlich wie eine typische Sed-Strategie, nämlich

echo "./" | sed -e 's:\(..*\)/$:\1:'

Ich hoffe, dass dies für Sie von Nutzen ist.

0 Stimmen

Es ist schön zu sehen, dass das reale Problem des Root-Verzeichnisses angesprochen wird. Zwei zusätzliche Ideen: 1) Ich glaube, die empfohlene Art der Ersetzung von Captures in der Ersetzung ist eher "$" als "\", obwohl beides funktioniert. 2) Es könnte effizienter sein, nur das Zeichen kurz vor dem abschließenden / zu erfassen, anstatt potenziell sehr viele Zeichen. Unter Berücksichtigung dieser beiden Änderungen würde ich es machen: s{(.)/\z}{$1}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X