Comment supprimer ou remplacer des mots familiers dans une chaîne de caractères par une liste de variantes familières de ces mots ?
La liste contient ~40 stubs (sous-chaînes). Avec tout cela, je m'attends à des centaines de substituts de mots correspondants.
Je suis intéressé par la solution de la formule car je sais déjà comment faire, en codant VBA.
J'ai joué autour de TEXTJOIN avec FILTERXML, mais il n'est pas possible de l'utiliser pour une grande liste de stub :
Formule 1. FILTERXML (talon saisi un par un)
=IFERROR(TEXTJOIN(" ";;FILTERXML("<A><B>"&SUBSTITUTE(A2;" ";"</B><B>")&"</B></A>";"//B[not(contains(., 'auti') or contains(., 'AuTi') or contains(., 'tion') or contains(., 'mpl') or contains(., 'Mpl')or contains(., 'etc'))]"));"")
Le résultat est bon, mais malheureusement il est sensible à la casse, donc les substrats entrés un par un pour toutes les versions de capitalisation (Propercase, UPERCASE, lowercase, MixEdCase) génèrent une très grande formule impossible à utiliser à cause de la limitation de longueur (255 caractères).
Formule 2. FILTERXML (avec traduction de cas)
=IFERROR(TEXTJOIN(" ";;FILTERXML("<T><S>"&SUBSTITUTE(A2;" ";"</S><S>")&"</S></T>";"//S[not(contains(translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'),'auti')or contains(., 'tion')or contains(., 'mpl')or contains(., 'etc'))]"));"")
Le résultat est apparemment bon, mais il y a d'étranges correspondances de capitalisation manquées (vérifiez la cellule D14 dans l'image jointe). Pour éviter cela, je peux utiliser une traduction pour chaque stub translate(., 'AUTI', 'auti'),'auti')
mais la limitation de la longueur ne me permettra pas d'utiliser toute la liste.
Formule 3. FILTERXML (avec LOWER-ing toutes les chaînes)
=IFERROR(TEXTJOIN(" ";;FILTERXML("<A><B>"&SUBSTITUTE(LOWER(A2);" ";"</B><B>")&"</B></A>";"//B[not(contains(., 'auti')or contains(., 'tion') or contains(., 'mpl') or contains(., 'etc'))]"));"")
Le résultat est bon, mais la chaîne de sortie est totalement inférieure. Et la limitation de longueur est toujours présente.
Je sais que FILTERXML est un bon moyen pour cette tâche, mais je ne sais pas comment travailler avec. Malheureusement Xpath 1.0 ne permet pas des choses comme matches()