Ich habe Zeilen von Daten in ein Array in Perl gelesen werden, das wie folgt aussieht:Legen Sie Anführungszeichen um Datum in der Nähe von Ende der Zeichenfolge in Perl mit regex
aaa bbb ccc ddd -
aaa bbb ccc ddd eee -
Ich versuche, in Anführungszeichen bestimmte Bereiche zu injizieren in jeder Zeile - der letzte und der drittletzte. Ich würde die Linien mag so aussehen, wenn ich fertig bin:
aaa bbb "ccc ddd" -
aaa bbb ccc "ddd eee" -
Ich habe versucht, die Linie in ein Array aufteilen und mit Hilfe der @array [-3] Notation, aber das geteilte entledigt Alle Leerzeichen werden als Trennzeichen verwendet. Ich glaube, ich brauche eine Rückreferenzierung mit einem Substitutions- etwas ähnliches zu verwenden:
s/(\s+[^\s]*\s+)$/\"$+\"/
Außer, dass ich nicht herausfinden können, wie das Spiel zu machen, die spezifischen Felder, die ich brauche und überspringen die letzten. Momentan wird das letzte Anführungszeichen nach dem Zeilenumbruch eingefügt.
Vielen Dank für die Antwort. Ich bin wirklich noch ziemlich neu in Regex - ich dachte, ich müsste Rückreferenzen verwenden, um etwas zu ersetzen. Wenn ich in Perl ein Gleiches mache wie '$ var = ~ s/\ w + \ s + \ w + (?= \ s -)/$ 0/', wird es standardmäßig mit der ganzen Zeichenfolge übereinstimmen? – Basil
Und noch eine Frage - wenn ich der letzten Spalte erlauben wollte, dass sie irgendwas ist, nicht nur ein Bindestrich, würde sie in \ w + $ work ändern, so: '$ var = ~ s/\ w + \ s + \ w + (? = \ s + \ w + $)/$ 0/'? – Basil
Erste Frage: Der Lookahead '(? = \ S-)' schaut einfach voraus, um zu sehen, ob die nächsten Zeichen ein Leerzeichen gefolgt von einem Bindestrich sind. Der Blick nach vorne sieht einfach aus, ob das die nächsten Zeichen sind, aber sie werden nicht in das Capture aufgenommen. Auch die Suchfunktion in Perl ist nur 's /...../' in Ihrer Frage würde das abschließende '$ 0 /' verwendet werden, wenn Sie eine Ersetzung ausführen. aber das Ersetzen der gesamten gefundenen Zeichenfolge durch $ 0 würde keine Änderungen ergeben. –