2016-07-07 25 views
1

Ich habe zwei Arten von Schnittstellen "Ethernet9/12/1 und Ethernet8/34". Ich wollte beide Arten von Schnittstellen mit einem einzigen regulären Ausdruck analysieren.TCL Regulärer Ausdruck

Ich habe versucht, dies in der unten Art und Weise zu erreichen:

set int "Ethernet9/12/1" 
regexp -nocase "(.*t)((\\d+)\/(\\d+)/\(\\d+))" $int - int_type int_num mod_num port broken_port 
puts $int_type 
puts $int_num 
puts $mod_num 
puts $port 
puts $broken_port 

Dieser Code für Ethernet9/01.12 funktioniert. Derselbe Regexp funktioniert jedoch nicht für Ethernet8/34. Ich brauche Hilfe, um dies in der einzelnen Regexp mit TCL zu erreichen.

Bitte helfen.

+0

Versuchen Sie es mit: „(. * T) ((\ d +)/(\ d +) (/ \ d +) *) " – Ohumeronen

+0

gesetzt int" Ethernet91/12/2 " regexp -nocase" (. * t) ((\\ d +) \/(\\ d +) \/(\\ d +)) "$ int - int_type int_num mod_num port brok de_port puts $ int_type puts $ int_num puts $ mod_num puts $ port puts $ broken_port – Santhosh

Antwort

0

benötigen Sie den letzten Teil optional mit einer Nicht-Erfassung Gruppe zu machen:

regexp -nocase "(.*t)((\\d+)\/(\\d+)(?:/(\\d+))?)" $int - int_type int_num mod_num port broken_port 
            ^^^  ^^ 

Siehe IDEONE Tcl demo

Ausgang:

Ethernet 
8/34 
8 
34 

Eine Nicht-Erfassung Gruppe nur gemeint gruppiert Subpattern und stört nicht die Erfassungsgruppen, die Sie bereits definiert haben, um später verwendet zu werden.

+0

Vielen Dank R Nar und Wiktor. Deine Lösung hat mir geholfen. Haben Sie Referenzmaterial/Website Zeiger, die mich über Regexp optionale Teil und andere erweiterte Regexp Inhalte lehren. – Santhosh

+0

Eigentlich, optional in Regex bedeutet, etwas 1 oder 0 Mal zu entsprechen. Dies ist eine grundlegende Sache, ein '?' Quantifizierer. Siehe [dieses Quantifizierungs-Cheatsheet] (http://www.rexegg.com/regex-quantifiers.html#cheat_sheet). Um eine optionale Ziffer nach einer Folge von Buchstaben zu finden, würde man '[a-zA-Z] + \ d?' Verwenden. Hier ist ein schöner Artikel über optionale Regex-Muster: [* 'Optional Items' * bei * regular-expressions.info *] (http://www.regular-expressions.info/optional.html). –

0

gerade den zweiten Teil mit ? optional machen:

(.*t)((\d+)\/(\d+)(?:\/(\d+))?) 

auf regex101

Geprüft

HINWEIS: Ich entkam Ihre / Zeichen mit einem \ aber das könnte Geschmack spezifisch.

0

Der Code wird viel besser beherrschbar, wenn man nicht die gesamte Verarbeitung innerhalb der regulären Ausdrücke konzentriert.

set int Ethernet9/12/1 

regexp -nocase {(.+t)(.*)} $int -> int_type int_num 
lassign [split $int_num /] mod_num port broken_port 

puts [list $int_type $int_num $mod_num $port $broken_port] 
# -> Ethernet 9/12/1 9 12 1 

set int Ethernet8/34 

regexp -nocase {(.+t)(.*)} $int -> int_type int_num 
lassign [split $int_num /] mod_num port broken_port 

puts [list $int_type $int_num $mod_num $port $broken_port] 
# -> Ethernet 8/34 8 34 {} 

Dokumentation: lassign, list, puts, regexp, set, split, Syntax of Tcl regular expressions