/ / expect: Parsen einer Variablen - Regex, Tcl, Expect

expect: parsing einer Variablen - regex, tcl, expect

Es sind viele Fragen zu regulären Ausdrücken zu erwarten, aber ich habe meine Antwort nicht gefunden. Ich bin neu zu erwarten, aber keine regulären Ausdrücke. Ich habe eine Variable in einem Expect-Skript mit diesem Text:

IP Address Source       : Static Address
IP Address              : 1.2.3.4
Subnet Mask             : 255.255.255.0

Ich möchte die Werte auf der rechten Seite der Doppelpunkte analysieren. Ich habe verschiedene Versionen des Folgenden ausprobiert, aber ich bekomme keine Übereinstimmung.

if { [regexp -linestop "IP Addresss*:s*(.+)" $network ignore ip] } {
puts "IP: ($ip)"
}

Es scheint, dass das s nicht als erkannt wirdLeerzeichen in erwarten? Auch ausprobierte Versionen mit [[: space:]]. Ich muss nach dem Leerzeichen suchen, um die zweite Zeile von der ersten zu unterscheiden. Dies passt zu etwas (nicht was ich will), aber wenn ich das "s" wie oben hinzufüge, passt es überhaupt nicht.

if { [regexp -linestop "IP Address(.+)" $network ignore ip] } {
puts "IP: ($ip)"
}

Antworten:

2 für die Antwort № 1

Während s ist Von der RE - Engine als Leerzeichen erkannt, wird es bevorzugt als Anführungszeichen behandelt s auf dem allgemeinen Sprachniveau; nicht was du willst! Es ist bei weitem besser, reguläre Ausdrücke einzufügen {Hosenträger} Anstatt von "Anführungszeichen" da dies diese unerwünschten Fluchten (und auch andere) hemmt.

if { [regexp -linestop {IP Addresss*:s*(.+)} $network ignore ip] } {
puts "IP: ($ip)"
}

Dies führt nur dann zu echten Problemen, wennSie möchten einen Teil eines regulären Ausdrucks in einer Variablen behalten. Dies ist eine weitaus seltenere Situation, als wenn Sie möchten, dass die Tcl - Sprachanalyse - Engine Ihnen nicht im Weg steht.


1 für die Antwort № 2

Wenn du sie alle haben willst:

% set x {IP Address Source       : Static Address
IP Address              : 1.2.3.4
Subnet Mask             : 255.255.255.0}
% foreach {all match} [regexp -line -all -inline {: (.*)} $x] {
lappend values $match
}
% set values
{Static Address} 1.2.3.4 255.255.255.0

0 für die Antwort № 3

Sie können diese Regex versuchen,

:s(.+)

Es erfasst die Gruppe.

Demo