expression régulière correspondante {*} en tcl
Je suis en train de faire correspondre un nom à lui-même à une possible suffixe à l'aide de la {*}
expression régulière dans un script TCL. Par exemple:
#!/usr/bin/tclsh
set name "g_renamed_d"
set pattern "g_renamed*"
if { [string match "$name" "$pattern"]} {
puts " matched!"
} else {
puts " not matched!!!!!"
}
Quand cela ne fonctionne pas j'ai essayé de supprimer l'étoile du modèle de variable et en utilisant [string match "$name" "$pattern"*]
ou [string match $name $pattern*]
ou [string match $name {$pattern*}]
mais en vain. J'ai vu d'autres exemples qui semblent identiques à ce que j'ai fait; ce qui me manque?
- La syntaxe de
string match
est chaîne de match ?option? chaîne de modèle. Les Regex, c'est autre chose et utilise regexp chaîne de modèle ?match? ?submatch1? ...
Vous devez vous connecter pour publier un commentaire.
Vous pouvez essayez avec cette syntaxe:
Noter que le modèle ci-dessus permet tous les types de caractères y compris les espaces blancs à l'exception des retours à la ligne. Si vous voulez un plus "raisonnable" de modèle, vous pouvez remplacer la virgule par un caractère de classe avec les personnages qui vous permettent dans le suffixe:
ou
Mais ce modèle est suffisant si vous voulez seulement vérifier que votre chaîne commence avec votre cible:
Vous mélangez la
glob
de style étoiles avec les expressions régulières (Kleene) star.Dans les expressions régulières,
*
ne signifie pas "une chaîne de caractères," comme c'est le cas dansglob
de style usages.*
,+
, et?
sont toutes connues sous le nom quantificateurs, respectivement sens "0 ou plus", "1", "0 ou 1" répétitions de le précédent atome (caractère).Ainsi, par exemple,
*
par lui-même ne fait rien, maisa*
correspond à 0 ou plusa
s.Pour correspondre à 0 ou plus rien, vous voulez mettre un quantificateur sur un générique, qui, dans les expressions régulières est
.
, qui signifie "n'importe quel caractère sauf les caractères de saut de ligne." C'est pourquoi, comme @CasimiretHippolyte a noté dans sa première réponse, vous voulezg_renamed.*
.Aussi, la façon
regexp
correspondance des œuvres, c'est qu'elle renvoietrue
si le modèle correspond n'importe où dans la chaîne. Qui est, le nom,foog_renamedbar
passerait trop! C'est là que @CasimiretHippolyte a proposé l'utilisation d'un d'ancrage,^
, qui correspond au début de la chaîne, c'est à dire le motif est ancré le début de la chaîne. (De même,$
est une autre ancre, celui-ci correspondant à la fin de la chaîne.)Par ailleurs, si vous voulez vraiment
glob
-style correspondant, puis utilisezstring match
.Votre faire inverser la comparaison. Il suffit de changer le contenu du travail. Comme
déclencher;
tcl;
string match -nocase $name $pattern
est parfaitement bien.eval
?