Ich möchte einige Pfadnamen regexpieren und behalten.
Meine zu testenden Zeilen sind wie folgt:
"/home/tclshell/test.tcl.gz"
"/home/tclshell/test1.tcl"
/home/tclshell/test.tcl
So traute es Dinge wie:
regexp {(S+.tcl(?:.gz)?)} $line blank mypath
oder
regexp {(S+.tcl(|.gz))} $line blank mypath
Aber es scheint nicht zu funktionieren "
scheint in gehalten zu werden $mypath
. Was ist falsch in der Regexp?
Antworten:
1 für die Antwort № 1Der Punkt ist, dass S
passt auf ein beliebiges Zeichen, aber auf Leerzeichen, damit es auch übereinstimmt "
.
Sie können ein optionales hinzufügen "
am Anfang des Musters, aber außerhalb der einfangenden Gruppe - "?(S+.tcl(?:.gz)?)
:
set line ""/home/tclshell/test.tcl.gz""
regexp {"?(S+.tcl(?:.gz)?)} $line blank mypath
puts $mypath
Sehen Tcl Online-Demo
Ein anderer Weg ist das Ausschließen der "
von S
indem Sie es durch eine negierte Zeichenklasse mit umgekehrter Kurzschreibeklasse für Leerzeichen ersetzen (s
) und Hinzufügen der "
hinein: [^s"]
:
([^s"]+.tcl(?:.gz)?)
Siehe die Regex-Demo