Ma fonction Expression régulière ne fonctionne pas

Codes specifiques à Windows
hub73
Messages : 126
Inscription : sam. 16/janv./2021 20:17

Ma fonction Expression régulière ne fonctionne pas

Message par hub73 »

Bonjour à vous.
Je ne vois pas mon erreur sur cette fonction.
[a-zA-Z0-9_] : Caractères minuscules et majuscules, chiffre de 0 à 9 et le caractère souligné du 6 autorisés.
Prenom$ = "hubert!?"
devrait me retourner le message d'erreur mais non.
Merci de votre aide.

Code : Tout sélectionner

Procedure.l Verifier_expression_reguliere_correcte (ExpressionReguliere$, Source$)
  
  Protected Resultat
  
  Protected Id
  
  Id = CreateRegularExpression(#PB_Any, ExpressionReguliere$)
  If Id <> 0  
    If MatchRegularExpression(Id, Source$) >= 1
      Resultat = #True
      Debug "Vrai"
    Else
      Resultat = #False
      Debug "Faux"
    EndIf
    FreeRegularExpression (Id)
  Else
    MessageRequester ("Erreur !", "Erreur de formulation de contrôle d'expression régulière : " + RegularExpressionError())
  EndIf
  
  ProcedureReturn Resultat
      
EndProcedure

Prenom$ = "hubert!?"

If Verifier_expression_reguliere_correcte ("[a-zA-Z0-9_]", Prenom$) = #False
  MessageRequester ("Erreur", "Le prénom doit être composé de lettres, chiffres et le caractère tiret du 6 _ uniquement ! ", #PB_MessageRequester_Error)
EndIf 
Marc56
Messages : 2197
Inscription : sam. 08/févr./2014 15:19

Re: Ma fonction Expression régulière ne fonctionne pas

Message par Marc56 »

Ton expression signifiait "au moins une des lettres" (donc tout y passe)
Rapidement, ceci fonctionne (il existe des tas de façons de faire)

Code : Tout sélectionner

"[a-zA-Z0-9_]+[ \r\n]"
= Plusieurs des caractères suivi d'un espace ou d'un saut de ligne
ou même \w+[ \r\n]
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: Ma fonction Expression régulière ne fonctionne pas

Message par Mesa »

Il vaut mieux rechercher les caractères interdits.

Code : Tout sélectionner

Procedure.l Verifier_expression_reguliere_correcte (ExpressionReguliere$, Source$)
	
	Protected Resultat
	
	Protected Id
	
	Id = CreateRegularExpression(#PB_Any, ExpressionReguliere$)
	If Id <> 0  
		If MatchRegularExpression(Id, Source$) >= 1
			Resultat = #False
			Debug "Le prénom contient des caratères interdits"
		Else
			Resultat = #True
			Debug "Ok"
		EndIf
		FreeRegularExpression (Id)
	Else
		MessageRequester ("Erreur !", "Erreur de formulation de contrôle d'expression régulière : " + RegularExpressionError())
	EndIf
	
	ProcedureReturn Resultat
	
EndProcedure

Prenom$ = "hubert!?"

If Verifier_expression_reguliere_correcte ("[^a-zA-Z0-9_]", Prenom$) = #False
	MessageRequester ("Erreur", "Le prénom doit être composé de lettres, chiffres et le caractère tiret du 6 _ uniquement ! ", #PB_MessageRequester_Error)
EndIf 

Prenom$ = "hubert_"

If Verifier_expression_reguliere_correcte ("[^a-zA-Z0-9_]", Prenom$) = #False
	MessageRequester ("Erreur", "Le prénom doit être composé de lettres, chiffres et le caractère tiret du 6 _ uniquement ! ", #PB_MessageRequester_Error)
EndIf 
M.
Marc56
Messages : 2197
Inscription : sam. 08/févr./2014 15:19

Re: Ma fonction Expression régulière ne fonctionne pas

Message par Marc56 »

Oui, exactement :D
hub73
Messages : 126
Inscription : sam. 16/janv./2021 20:17

Re: Ma fonction Expression régulière ne fonctionne pas

Message par hub73 »

Super. Merci à tous les deux.
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Re: Ma fonction Expression régulière ne fonctionne pas

Message par boddhi »

Pour le fun et à toutes fins utiles,

Une variante possible :

Code : Tout sélectionner

^(?i)[\da-z-]+$

^ : Qui doit commencer impérativement par la séquence qui suit
(?i) : Insensibilité à la casse pour ce qui suit
[ : Tout caractère autorisé par la contrainte définie jusqu'à ]
\d : Tout chiffre
a-z (ou A-Z) : Toute lettre non accentuée de a à z (ou A à Z puisqu'insensible à la casse)
- : Signe moins
+ : Une ou plusieurs itérations du caractère contraint précédemment
$ : Qui doit se terminer impérativement par la contrainte précédente

La même mais avec l'obligation d'avoir une lettre majuscule pour initiale (imposée par le segment [A-Z]) :

Code : Tout sélectionner

^[A-Z](?i)[\da-z-]+$
Note : Pour gérer les lettres accentuées qui ne sont pas permises dans ces deux exemples, il convient d'ajouter entre les [] celles que l'on souhaite autoriser.
Répondre