2017-12-29 9 views

Antwort

2

Sie müssen das Spiel nicht gierig machen, dh sicherzustellen, dass es so bald endet als hat es eine minimale Übereinstimmung gefunden, nicht, wenn es so viel Text wie möglich abgestimmt hat. Dies geschieht durch Verwendung eines +? Quantifizierers (entsprechend dem gierigen + Quantifizierer): in diesem Fall ist auch eine nicht einfangende Gruppe ((?:...)) notwendig.

% regexp -inline -all {(?:[^/]+_ger_)+?} $s1 
some_word_g3_ger_ another_word_g1_ger_ 

ETA:

Ein regulärer Ausdruck ist hier hilfreich, da es sowohl mit Überspringen der unerwünschten Text und zerhacken die Token umgehen können. Wenn es praktikabel ist, den unerwünschten Text in einem ersten Schritt zu entfernen, werden mehrere andere Methoden mindestens ebenso nützlich. Zum Beispiel:

set s1 some_word_g3_ger_another_word_g1_ger_ 
string map {_ger_ {_ger_ }} $s1 

(Dies führt zu der Zeichenfolge „some_word_g3_ger_ another_word_g1_ger_“ mit einem Hinter leer, aber es ist noch funktional äquivalent zu der Liste dieser beiden Token.)

Dokumentation: regexp, Syntax of Tcl regular expressions

+0

Es ist verlockend, den Wächter außerhalb des Spiels gegen Schrägstriche zu bewegen, aber dann bekommst du nicht das saubere Ergebnis, das du hier bekommst. –

+0

Vielen Dank! Das hat funktioniert. –

0

Hier ist eine andere Technik, string Befehle:

set base [file tail $s1] 
set start 0 
while {1} { 
    set idx [string first _ger_ $base $start] 
    if {$idx == -1} break 
    lappend bits [string range $base $start $idx+4] 
    set start [expr {$idx + 5}] 
} 
set bits 
# => some_word_g3_ger_ another_word_g1_ger_ 
Verwandte Themen