Ajustement Expression régulière

domar - 22 juin 2024 à 17:33
NHenry Messages postés 15140 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 30 juin 2024 - 23 juin 2024 à 21:43

Bonjour,

Je cherche à peaufiner mon expression régulière de validation d'un champ "Prénom".

Je suis arrivé à ceci

^([A-Z]([a-z'àâäéèêëïîôöùûüÿç])*)+((-|\s|')?([A-Z]([a-z'àâäéèêëïîôöùûüÿç])*)+)*$

qui fonctionne pas mal. 

L'expression valide des prénoms suivants :

Jean
Jean-Pierre
Paule Gloria
Maël
J-F
Derc'hen
Françoise

et invalide tous ceux-ci :

pierre (Maj manquante)
Pierre (Espace après le prénom)
Pierre- (Tiret en dernier caractère)
Jean pierre (Maj au 2ème prénom manquante)
jean Pierre (Maj au 1er prénom manquant
Jean--Pierre (2 tirets à suivre)
Jean  Pierre (2 espaces à suivre)
Jean- Pierre (Tiret + Espace à suivre)
Jean - Pierre (Espace + Tiret + Espace) 

C'est parfait mais elle valide également ceci 
JeanPierre
qui ne me convient pas.

Il manque une règle stipulant qu'après 1 espace ou un tiret, le mot doit commencer par une Majuscule.

Je suis à court d'idée. Merci d'avance pour votre aide?

Bien à vous

4 réponses

NHenry Messages postés 15140 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 30 juin 2024 159
22 juin 2024 à 18:41

Je pense que parfois, quelques lignes de code sont plus faciles à comprendre que une expression régulière.

Par ailleurs, cela me remémore ceci :
https://github.com/kdeldycke/awesome-falsehood#human-identity

Plus précisément :
https://shinesolutions.com/2018/01/08/falsehoods-programmers-believe-about-names-with-examples/

9-People’s names are written in ASCII.
Patently false, if we consider that ASCII does not include the accented characters which appear in French and Portuguese names. Nor does it include the Greek alphabet used in Greek names, Cyrillic characters for Russian names. Then there are scripts like Devanagari for Indian names, Chinese characters (hanzi) and Japanese characters (Kanji), and many more.

mais d'autres constats sont tout aussi vrai dans les pages listées.


Merci beaucoup NHenry pour ces références qui font que l'on se sent tout petit...et que l'on se couche tard !-) C'est tout à fait passionnant. C'est un art d'être rigoureux sans être rigide...

0
Whismeril Messages postés 19082 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 9 juillet 2024 658
23 juin 2024 à 09:40

Salut NHenry,

j'avais commencé ma réponse avant que tu postes, puis j'ai fait autre chose avant de la finir, sans réactualiser la page.

Je n'avais pas imaginé autant de fausses idées, mais j'étais un peu dans cet optique en disant que je serai agacé qu'un logiciel me dise que je ne sais pas écrire mon propre nom.

J'ai d'ailleurs repensé à un adhérent d'une asso dont je suis le secrétaire dont le nom s'écrit avec 2 - successifs et qui y tient.

0
NHenry Messages postés 15140 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 30 juin 2024 159 > Whismeril Messages postés 19082 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 9 juillet 2024
23 juin 2024 à 21:43

Autre exemple, les personnes ont forcément un nom et un prénom ... en Europe déjà c'est pas toujours garanti ..

Un nom ou un prénom est composé de plusieurs caractères ... donc pour cet ancien ministre https://en.wikipedia.org/wiki/C%C3%A9dric_O c'est cuit ? (ben oui, son nom de famille c'est une seule lettre)

Tant de suppositions qui ne correspondent qu'à notre vision très localisée du monde.

0
Whismeril Messages postés 19082 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 9 juillet 2024 658
22 juin 2024 à 19:40

Bonjour

Il ne manque pas de règles à ta Regex.

Il y en a trop.

Ce que tu veux, c'est un mot avec majuscule à la première lettre, avec éventuellement un séparateur et un second mot.

Ce que tu as codé, c'est plusieurs mots sans séparateur, puis éventuellement un séparateur, puis éventuellement plusieurs mots et éventuellement n'importe quoi.

Pour preuve https://regex101.com/r/lpheEB/1 (avec le moteur par défaut, mais tu y peux tester celui qui te concerne)

Comme tu peux le voir, le premier match commence à Jean et finit à Françoise.

Du coup, conseil 1, utilise un site comme regex101 ou regexstrom pour .net.

Et écrire morceau par morceau au plus simple.

Donc, on commence par un mot https://regex101.com/r/lpheEB/2

Il ne faut pas les parenthèses et le +, sinon, ça prend JeanPierre.

https://regex101.com/r/lpheEB/3

Ensuite, tu veux éventuellement le séparateur ET un mot et pas éventuellement un séparateur et éventuellement un mot

https://regex101.com/r/lpheEB/4

^[A-Z]([a-z'àâäéèêëïîôöùûüÿç])*([- ][A-Z]([a-z'àâäéèêëïîôöùûüÿç])*)?$

Plus simple, et répond au besoin que tu as décrit.

Mais, y'a plein de groupes, peut-être que c'est une bonne chose pour toi ou peut-être pas.

Du coup, on peut faire en sorte de ne pas avoir de groupes.

https://regex101.com/r/lpheEB/5

^[A-Z](?:[a-z'àâäéèêëïîôöùûüÿç])*(?:[- ][A-Z](?:[a-z'àâäéèêëïîôöùûüÿç])*)?$


Cependant, perso ça m'agacerait de me voir rejeter ma saisie parce que j'ai mis un espace de trop, ou pas de majuscule.

Pour l'expérience utilisateur, avoir une validation plus souple et remettre en forme après est beaucoup mieux, je pense 


Un grand merci Whismeril. A ce niveau là ce n'est plus une réponse, c'est cours complet ;-)
Sans vouloir abuser, que signifie " ?:  " ?

Pour répondre aux dernières remarques auxquelles j'adhère, ce RegEx est destiné à de la validation de données pour uniquement 2 ou 3 personnes spécifiques. Ce RegEx permettra également du contrôle de données déjà saisies à des fins d'uniformisation.

Merci encore pour cette super réponse.

Whismeril Messages postés 19082 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 9 juillet 2024 658
23 juin 2024 à 11:17

Supposons que le texte "la  lala la la lalalalalala lala la la"

Je veux récupérer les assemblages de la.

Premier réflexe, j'écris 

(la)+

Ce qui donne https://regex101.com/r/dWVxoi/1

On voit, match 1 "la", group1 "la", match 2 "lala", group 1 "la", etc...

Par ce que je me suis dit, le + concerne ce qui est entre parenthèses.

Oui, mais en plus pour une regex, ça implique une "sous capture" appelée group dans certains langages et submatch dans d'autres.
 

Maintenant, supposons que le texte "la  lola la lo lalolalolalo lalo la lo" et veux veux les assemblages de "la" et de "lo".

Et puis ho zut, je ne code pas en PHP, mais en .Net 7 ou plus.

(l[ao])+

https://regex101.com/r/dWVxoi/2

On voit, match 1 "la", group1 "la", match 2 "lala", group 1.1 "lo", group 1.2 "la", etc...

Si tu veux pouvoir faire la différence entre les la et les lo, c'est parfait (enfin, à priori pas en PHP ou regex101 n'affiche que la dernière sous capture...).

Mais c'est itératif (récursif ? ), on peut donc supposer que ça prend de la ressource, à minima pour stocker les sous captures.

Si tu n'as pas besoin de différencier, ou que tu espères un peu économiser de ressources, ou que ta syntaxe impose de très nombreux groupes, mais que seulement quelques-uns te sont utiles. Alors, tu peux indiquer par ?: que le contenu de cette parenthèse ne constitue pas une sous capture.

(?:l[ao])+

https://regex101.com/r/dWVxoi/3

Là, on ne voit plus que les matchs, plus de group

Regex101 est très pratique pour tester et partager les regex.

Mais je code principalement en .Net, et pendant longtemps ce moteur n'étais pas pris en compte par ce site, j'utilisais donc http://regexstorm.net/

Qui non seulement dispose d'une interface de test, mais aussi d'une "regex reference" où toutes les syntaxes disponibles en .Net sont expliquées et assorties d'exemples.

Il faut quand même faire attention que certains trucs qui marchent en .Net, ne marche pas partout, on a vu plus haut que PHP ne fait pas de sous captures indexées.

.Net permet aussi de nommer les groupes (ce qui est plus facile à utiliser que par leurs numéros), ça n'est pas le cas de tous les langages.


Rejoignez-nous