2017-01-24 3 views
1

Ich habe eine Variable übereinstimmen, die folgenden ZeichenRegexp spezifische Zeichen in tcl

"@/$% & * # {} 4g _. [] [email protected]" enthält

Ich möchte passen nur "4g_.3435_.technologylte042" durch den Ausschluss von Sonderzeichen

Code:

set a "@\/$%&*#[](){}4g_.[][email protected]" 
regexp {[\w._-]+} $a match 
puts $match 

I-Ausgang bekam:

4g_.3435_.technology 

Ich bin nicht restlichen Zeichen bekommen "lte042"

bitte helfen.

+0

Beachten Sie, dass '\ W' bereits Strich enthält - http://tcl.tk/ man/tcl8.6/TclCmd/re_syntax.htm # M68 –

Antwort

2

Ich nehme an, Sie versuchen, alle Nicht-Wort-Zeichen zu entfernen, anstatt zu versuchen, die erste zusammenhängende Folge von Wortzeichen zu finden. Sie könnten eine wiederholte Suche und Ersetzen verwenden:

regsub -all {[^\w._-]+} $a "" match 

Eine weitere Option ist die -all -inline Optionen zu verwenden, um eine Liste der Spiele statt einem Einzelspiel zu produzieren. Dadurch werden jedoch Leerzeichen zwischen den aufeinander folgenden Übereinstimmungen eingefügt. ZB:

set a "@\/$%&*#[](){}4g_.[][email protected]" 
set match [regexp -all -inline {[\w._-]+} $a] 
puts $match 

==>

4g_.3435_.technology lte042 

Die zweite set ist notwendig, da die -inline Option als Befehlsparameter angegeben wurde, nicht Anpaßvariablen erlauben werden.

+0

Ich habe Ihren Code getestet. Still @ bleibt übrig. Ausgabe war "[email protected] – gpk

+0

@gpk: Sorry, verpasste die" wiederholte "-Option," -all ". Fixed und getestet. – rici

+0

Danke ... Es hat funktioniert ... !! Gibt es einen Weg zu bekommen Das gleiche Ergebnis mit regexp. – gpk