Comme je le disais dans un précédent message, cette expression régulière
(en format PCRE étendu "/x" où tous les blancs non marqués par un "\" ne
sont pas significatifs) fait le job d'analyse:

^
(?:
  (?:\+|00|011)[\.\/\-\ \t]*
  (?# group 1: country code after international dialing code)

([17]|2(?:[07]|[1-689]\d)|3(?:[0-4679]|[578]\d)|4(?:[013-9]|2\d)|5(?:[1-8]|[09]\d)|6(?:[0-6]|[789]\d)|8(?:[1246]|[035789]\d)|9(?:[0-58]|[679]\d))
  [\.\/\-\ \t]*
| (?# group 2: single-digit country code without international dialing code)
  ([17])
  [\.\/\-\ \t]+(?# a separator is required for disambiguation)
)?
(?# group 3: area code between parentheses, optional)
(?:\((\d{1,4})\)[\.\/\-\ \t]*)?
(?# groups 4-7: leading groups of digits, may be empty)
(?:(\d{1,6})[\.\/\-\ ])?
(?:(\d{1,6})[\.\/\-\ ])?
(?:(\d{1,6})[\.\/\-\ ])?
(?:(\d{1,6})[\.\/\-\ ])?
(?# group 8: start of the last group of digits, may be empty)
(\d{0,10}?)
(?# group 9: up to 4 digits at end of the last group of digits)
(\d{1,4}+)
(?:
  [\.\/\-\ \t]*e?xt?[\.\/\-\ \t]*+
  (?# group 10: extension code, optional)
  (\d{1,14})
)?
$


Testée sur https://regex101.com/r/4wY5xA/48 (avec des exemples inclus), et
utilisée sur Wikidata (où elle détecte les formats réellement incorrects ou
ambigus).

Notes:
* Le groupe de capture 9 est un cas spécial juste destiné à la protection
de la vie privée (pour masquer une partie des chiffres à la fin du dernier
groupe précisé, jusqu'à 4 chiffres. On peut le supprimer de l'expression
régulière et ses chiffres sont alors inclus dans le groupe 8, le groupe 10
pour "l'extension" devient le groupe 9.
* La syntaxe "(?# ... )" indique un commentaire (non-significatif pour
l'analyse du texte source).
* La syntaxe "(?: ... )" indique un groupement logique pour une
sous-expression qui n'est inclus dans aucun groupe de capture, au contraire
de "( ... )" qui en plus crée un groupe de capture, numéroté
automatiquement à chaque occurrence d'une parenthèse initiale (non-marquée
par un drapeau "(?" suivi immédiatement d'un symbole spécial).
* La syntaxe "{1,4}+" ou "{0,10}?" ou "*+" peut sembler "étrange" pour ceux
qui ne la connaissent pas, mais n'est ni une erreur de syntaxe, ni un
non-sens : c'est la façon d'indiquer (en syntaxe PCRE ou Perl) qu'une
répétition est possessive/"dévoreuse" ("greedy" en anglais) avec le drapeau
"+"ajouté après le quantificateur de base ("?", "*", "+", "{n}", "{m,n}"),
ou non-possessive avec le drapeau "?" ajouté; cela permet d'indiquer
explicitement de quel côté (entre la sous-expression répétée et la
sous-expression de la suite, dont la première a des suffixes facultatifs
possibles qui sont communs aux préfixes facultatifs possibles pour la
seconde) les caractères trouvés seront inclus dans les groupes de capture
de part et d'autre du quantificateur de répétition ; c'est utile uniquement
dans ce cas-là, pour lever explicitement l'ambiguïté en fixant une priorité
et autorisant ou interdisant les retours en arrière ; ces drapeaux ne
changent pas les valeurs bornes du nombre de répétition. Dans les autres
cas, ces drapeaux n'ont aucun effet.
* Les répétitions non-possessives (avec "?") sont un plus coûteuses en
performance car le moteur d'expression régulière doit conserver dans une
pile un point de retour en arrière pour explorer les cas suivants, chaque
élément en pile contenant la liste des noeuds actifs dans le graphe NFA et
la valeur des compteurs de répétition). Habituellement un moteur
d'expression régulière est possessif par défaut (parfois c'est le
contraire, ou c'est indiqué par un drapeau de mode global) et il s'arrête à
la première correspondance trouvée, mais il ne revient alors pas en arrière
(pour explorer depuis un autre caractère avant le dernier inclus dans une
correspondance trouvée); mais avec ces drapeaux ajoutés aux répétitions, le
moteur peut changer *localement* ce comportement pour certaines répétitions
et pas d'autres.




Le jeu. 23 avr. 2020 à 15:28, deuzeffe <opensm....@deuzeffe.org> a écrit :

> Le 23/04/2020 à 08:52, Yves P. a écrit :
>
> > A moins qu'il existe déjà dans Osmose une bibliothèque pour reformatter
> > les n° de téléphone ?
>
> Il y a une analyse sur les n° de tel dans osmose, oui. Faut juste que tu
> la retrouves :P
>
> --
> deuzeffe
>
> _______________________________________________
> Talk-fr mailing list
> Talk-fr@openstreetmap.org
> https://lists.openstreetmap.org/listinfo/talk-fr
>
_______________________________________________
Talk-fr mailing list
Talk-fr@openstreetmap.org
https://lists.openstreetmap.org/listinfo/talk-fr

Répondre à