2016-12-29 1 views
0

voir le code ci-dessous, à titre d'exemple, j'essaie de trouver l'utilisation regsub avec backrefeence comme moyen d'utiliser sélectivement string toupper. Je ne reçois pas ce que j'ai prévu.
Voir exemple simple ci-dessous (oui, je sais que je peux utiliser string toupper $string 0 0, cependant, c'est juste pour montrer le principe, dans un exemple simple).tcl chaîne commande ne fonctionne pas avec regexp backreference

> puts [ regsub {^(.)} "min" "s\\1" ] 
smin 
> puts [ regsub {^(.)} "min" [ string toupper "\\1" ] ] 
min 

Comme on le voit, la chaîne toupper appliquée sur backreference ne fonctionne pas, mais le backrefernce peut être utilisé dans une double opération de devis.
J'utilise TCL ver. 8.6

+0

... et il n'y a aucun moyen cela pourrait fonctionner, comme la commande 'chaîne toupper' obtient exécuté AVANT la commande 'regsub'. –

+0

Voir https://ideone.com/EjXgje –

Répondre

1

Le string toupper fonctionne, mais ne fait pas ce que vous voulez; string toupper "\\1" est juste la chaîne \1 donc le regsub n'a pas beaucoup d'effet. Le problème est que regsub n'a aucun moyen de faire "exécuter cette commande sur les sites de substitution"; Je voulais régler ça depuis des années, mais je ne l'ai jamais vraiment fait (trop de projets pour que ce soit le cas).

Au lieu de cela, vous devez regsub une substitution de commande dans la chaîne, puis subst le résultat, mais pour ce faire, vous devez d'abord faire la chaîne autrement en toute sécurité à subst avec string map. Heureusement, c'est en fait assez simple.

J'ai divisé cette part pour le rendre plus facile pour vous d'examiner exactement ce que chaque étape fait:

set str "here is an example with \$dollars, \[brackets\] and \\backslashes" 

# Quote all of Tcl's metacharacters; there's not that many 
set safer [string map {[ \\[ ] \\] \\ \\\\ $ \\$} $str] 

# Inject the command we want to run where we want to run it 
set withsubst [regsub {^(.)} $safer {[string toupper {\1}]}] 

# Perform the substitution 
set result [subst $withsubst] 
+0

Je _really_ devrait écrire une proposition 'regsub -commande' ... –

+0

Eh bien, c'est nettement plus complexe que ce que vous trouveriez dans la substitution de regexp offerte, disons, par Ruby. Je vais essayer de cuisiner une procédure d'enroulement. Merci – user1134991

+1

Je sais; ça m'énerve depuis des années que nous devons faire ce genre de choses. –