Page 1 sur 1

[..] StringRegExp et les Accents

Posté : mar. 28 avr. 2015 12:28
par Zaibai
Bonjour,

Ma question peut vous paraître simple mais je parviens pas à trouver ma réponse...
J'aimerais que la commande StringRegExp ne tienne pas compte des accents.

Exemple:
StringRegExp("éxpérience", '(?i)(' &EXP& ')') ==> NOK
StringRegExp("éxpérience", '(?i)(' &ÉXP& ')') ==> OK

Comment faire pour que le premier exemple soit ÉGALEMENT OK ?
Merci d'avance pour vos réponses :)

Re: [..] StringRegExp et les Accents

Posté : mar. 28 avr. 2015 12:54
par jchd
Euh, ton exemple est une syntaxe incorrecte.

Enfin, cela n'est pas possible simplement avec une regexp PCRE. Tout ce que peut faire PCRE avec le support UCP (voir doc), c'est de gérer la casse (et encore avec certaines limitations).

J'ai fait une extension SQLite qui propose ce genre de choses mais c'est un poil lourd à utiliser. Ceci dit, c'est bien moins lourd que la bibliothèque ICU (19 Mb).

Re: [..] StringRegExp et les Accents

Posté : mar. 28 avr. 2015 13:36
par jguinch
Sinon, si c'est uniquement pour des caractères en français, un truc comme ça pourrait suffire :
► Afficher le texte
J'ai surement oublié plein de caractères, mais ça pourrait être un début (pour un besoin limité, on est bien d'accord ?)

Re: [..] StringRegExp et les Accents

Posté : mar. 28 avr. 2015 14:21
par Zaibai
Pour la syntaxe j'avais en effet une variable à place de "EXP", autant pour moi.
C'est pour plusieurs langue, avez-vous des pistes/solutions à me fournir ?

Re: [..] StringRegExp et les Accents

Posté : mar. 28 avr. 2015 15:05
par jchd
Oui, je vais te ficeler ça ce soir, je n'ai pas le temps là.
C'est pour quelles langues ?

Re: [..] StringRegExp et les Accents

Posté : mar. 28 avr. 2015 15:58
par Zaibai
Français, anglais, allemand, italien, espagnol.
Si je ne me trompe pas, il n'y a que l'espagnol qui contient des accents (en plus du français bien sur).
J'ajouterais sans doute d'autre langue plus tard, mais avec un "modèle" je devrais m'en sortir ! :)
Merci à tous :)

Re: [..] StringRegExp et les Accents

Posté : mar. 28 avr. 2015 16:36
par orax
J'ai augmenté le nombre de caractères d'après ce site http://textmechanic.com/Remove-Letter-Accents.html
Le petit inconvénient est qu'il faudra enregistrer le fichier au format UTF-8. File > Encoding...

(Ce qui est ci-dessous est basé sur le bidule code de jguinch plus haut.) :mrgreen:
► Afficher le texte

Re: [..] StringRegExp et les Accents

Posté : mar. 28 avr. 2015 16:47
par jchd
Ces quatre langues utilisent des lettres accentuées ou des mots en comportant. (De passage devant l'écran !)

orax,
Ce bidule est simpliste.

Re: [..] StringRegExp et les Accents

Posté : mar. 28 avr. 2015 23:54
par jguinch
@jc : simpliste peut-être, mais il pourrait couvrir le besoin s'il est complet. Mais niveau vitesse, je suis pas sûr qu'on soit au top avec un truc pareil...
Tu partirais sur quel piste toi ?

Re: [..] StringRegExp et les Accents

Posté : mer. 29 avr. 2015 00:06
par jchd
Voici un sketch :
► Afficher le texte
Le source et la DLL compilée en X86 sont téléchargeables ici.

Re: [..] StringRegExp et les Accents

Posté : mer. 29 avr. 2015 00:27
par jguinch
J'étais sûr qu'il y aurait du SQL là-dedans...
:D

Re: [..] StringRegExp et les Accents

Posté : mer. 29 avr. 2015 01:20
par jchd
En fait, SQLite n'est là que pour exploiter la DLL. On pourrait écrire un wrapper qui gèrerait tout ça mais il faudrait utiliser l'inteface imposée par le fait que ces fonctions (celles en C) sont écrites justement comme extensions SQLite.

Soit ça, soit récrire le module en C avec une interface directe UTF16. Je n'en ai franchement pas le temps et de plus on ne gagnerait que peu de chose à l'exercice : quelques cycles et un peu de code AutoIt pour planter le décor. Il est bien plus facile de planquer tout ça dans une UDF maison et de l'appeler comme si c'était du code UDF standard. Dans cet exemple, le code applicatif est entre les lignes de #############

Ah oui, j'oubliais : ma fonction unaccent convertit aussi les chiffres décimaux d'autres écritures (appelés "scripts" en linguistique) en chiffres usuels 0..9, fait des choses aux deux lettres sigma grecques, pareil au eszet allemand etc.

Autre bonus : la fonction typos dénombre l'écart entre deux chaînes et permet ainsi une recherche floue.

Dernier point important : contrairement à la bibliothèque ICU (un beau monstre), ces fonctions sont indépendantes des langues, même si c'est au prix de quelques approximations. Pour collationner deux chaînes, ICU impose de choisir la langue (le script) et à partir de là déploie des trésors de subtilité pour coller aux règles en vigueur pour ce script et un contexte donné(*). Comme j'avais besoin de fonctions multi-langues pour gérer une BdD alimentée par des sources parfois fort exotiques, je me suis vu contraint de parfois transgresser quelque peu l'exactitude locale au profit d'une relative universalité.

Consulter le mode d'emploi (ou plutôt ce qui en tient lieu) qui figure en tête du source C.

(*) Par exemple pour l'allemand, l'ordre du dictionnaire n'est pas le même que celui d'un répertoire téléphonique !
Autre exemple de particularisme des langues latines : en estonien, l'ordre des lettres est a ... i y j ... z ce qui rend le collationnement "naturel" faux si l'on ne tient pas compte de la langue.