Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Re: Verifier la presence d'un mot dans tous les champs

6 views
Skip to first unread message

Olivier Miakinen

unread,
Mar 3, 2023, 2:55:22 PM3/3/23
to
Le 03/03/2023 à 15:48, M.V. a écrit :
>
> Faudrait exactement savoir ce que signifie pour Olivier « le mot cœur
> est présent » car le script que j'ai indiqué considère que « De Montcuq
> à Moncœur » comme étant valide, ce qui est quand même plutôt contestable.

J'avais donné comme exemple la recherche de « cœur » sans préciser,
mais en réalité mon idée était de remplacer cette chaîne fixe par
une regexp quelconque.

Par exemple, pour ne détecter que « cœur » et pas « Moncœur » ni
« cœurs », il me suffisait dans la regexp complète de remplacer
/cœur/ par /\bcœur\b/.

--
Olivier Miakinen

Olivier Miakinen

unread,
Mar 3, 2023, 3:23:55 PM3/3/23
to
Le 03/03/2023 à 21:01, M.V. a écrit :
>
>> J'avais donné comme exemple la recherche de « cœur » sans préciser,
>> mais en réalité mon idée était de remplacer cette chaîne fixe par
>> une regexp quelconque.
>
> Ça correspond à ce que j'imaginais et donc le script AS précédent ne
> fonctionnait pas ! Celui que j'ai pondu dans
> <news:ttt2vc$lpku$1...@dont-email.me> irait beaucoup mieux.

Je ne sais pas si la construction que tu utilises, à savoir « if "cœur"
is not in item_list », utilise une comparaison de chaîne fixe ou bien
une regexp.

Dans le second cas, alors peut-être que ton script fait aussi bien
que la regexp /(^|,)((?!cœur).)*(,|$)/ ; dans le premier cas, non.

Par exemple, je pourrais remplacer « cœur » par « [a-z]{7}(xx|yyy) »
ou n'importe quelle autre regexp.

> Et ta recherche fait le distingo entre « cœur » et « Cœur » ?

Pour une recherche indépendante de la casse il me suffit d'ajouter
un i après le dernier /, donc : /(^|,)((?!cœur).)*(,|$)/i

Il y a aussi moyen de faire en sorte qu'une partie de la regexp soit
indépendante de la casse et qu'une autre partie ne le soit pas. Mais
ça, ce serait plus en charte sur fcl.regexp qu'ici.


--
Olivier Miakinen

Olivier Miakinen

unread,
Mar 3, 2023, 3:49:47 PM3/3/23
to
Le 03/03/2023 à 21:39, M.V. a écrit :
>
> Je ne sais pas… je ne comprends rien à regexp : un truc qui manque
> énormément à mon petit bagage !

Eh bien par exemple la regexp "[a-z] [0-9]" permet de détecter une
chaîne contenant une lettre minuscule sans accent, n'importe laquelle,
suivie d'une espace, suivie d'un chiffre, n'importe lequel.

Ainsi cela répondra oui à "toto 55" parce qu'il y a "o 5" dedans,
mais non à "55 toto".


--
Olivier Miakinen

Olivier Miakinen

unread,
Mar 3, 2023, 3:59:46 PM3/3/23
to
Le 03/03/2023 à 21:49, je répondais à M.V. :
>>
>> Je ne sais pas… je ne comprends rien à regexp : un truc qui manque
>> énormément à mon petit bagage !
>
> Eh bien par exemple la regexp "[a-z] [0-9]" permet de détecter une
> chaîne contenant une lettre minuscule sans accent, n'importe laquelle,
> suivie d'une espace, suivie d'un chiffre, n'importe lequel.
>
> Ainsi cela répondra oui à "toto 55" parce qu'il y a "o 5" dedans,
> mais non à "55 toto".

Après une recherche rapide sur la toile, j'ai l'impression que c'était
mort dès le départ pour faire ce que je voulais en Applescript :

<https://discussions.apple.com/thread/5740773?answerId=24357283022#24357283022>
§
AppleScript does not support regular expressions in text comparisons -
at least not without third-party support [...]
§


--
Olivier Miakinen

Olivier Miakinen

unread,
Mar 3, 2023, 5:59:03 PM3/3/23
to
Le 03/03/2023 à 22:18, M.V. a écrit :
>
>> Eh bien par exemple la regexp "[a-z] [0-9]" permet de détecter une
>> chaîne contenant une lettre minuscule sans accent, n'importe laquelle,
>> suivie d'une espace, suivie d'un chiffre, n'importe lequel.
>>
>> Ainsi cela répondra oui à "toto 55" parce qu'il y a "o 5" dedans,
>> mais non à "55 toto".
>
> OK, je vois.

Oui, mais c'était un exemple tout simple.

> C'est un tout petit moins simple en AppleScript mais ça se fait quand
> même très bien : prendre le 1er caractère de l'expression à tester,
> regarder s'il est dans [a-z], si oui regarder s'il est suivi d'une
> espace et si oui encore regarder si celle-ci est suivie par un chiffre
> entre 0 et 9.
> Si la réponse est NON à un des 3 critères alors passer au 2ème caractère
> de l'expression à tester, regarder s'il est dans [a-z], si oui regarder
> etc.
>
> Ça semble long quand on l'explicite mais un script fait ça en quelques
> millièmes de seconde pour une expression moins longue qu'un roman avec
> la chaine valide à la page 859 !

Alors prenons un autre exemple.

Comment écrirais-tu un programme capable de détecter si une chaîne de
caractères est un nombre en virgule flottante ?

Voici quelques exemples de nombres valides :
"0"
"+1.5"
"1e+99"
"-19E-7"
"1.7e003"
".3"

Et voici quelques exemples non valides :
""
"1.2.3"
"1E3.4"
"--1"
"e+99"
"."
"+1e"

Avec les regexp, le programme est par exemple :
/^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$/

--
Olivier Miakinen

Olivier Miakinen

unread,
Mar 3, 2023, 6:01:32 PM3/3/23
to
Le 03/03/2023 à 22:59, M.V. a écrit :
>
>> Après une recherche rapide sur la toile, j'ai l'impression que c'était
>> mort dès le départ pour faire ce que je voulais en Applescript
>
> Tu voulais vraiment quelque chose en AS alors que tu n'es pas sur Mac ?

Non, pas du tout. Je voulais une regexp. C'est Benoît L. qui a dit qu'il
pouvait le faire en AS, et André Favre qui a demandé sa solution.

> Tu voulais faire quoi exactement ?

Ça : /(^|,)((?!cœur).)*(,|$)/


--
Olivier Miakinen

Olivier Miakinen

unread,
Mar 3, 2023, 6:08:52 PM3/3/23
to
Le 04/03/2023 à 00:01, j'ai répondu un peu vite à M.V. avant de
comprendre vraiment quelle était sa question :
>>
>>> Après une recherche rapide sur la toile, j'ai l'impression que c'était
>>> mort dès le départ pour faire ce que je voulais en Applescript
>>
>> Tu voulais vraiment quelque chose en AS alors que tu n'es pas sur Mac ?

Alors non, mais c'est vrai que ma phrase pouvait prêter à confusion.

J'aurais dû la formuler de la façon suivante :
« Après une recherche rapide sur la toile, j'ai l'impression que c'était
mort dès le départ, si on avait voulu faire en AppleScript ce que je
voulais faire avec une regexp ».

Désolé pour le quiproquo.

--
Olivier Miakinen

Olivier Miakinen

unread,
Mar 4, 2023, 4:07:46 AM3/4/23
to
Le 04/03/2023 à 01:48, Joseph B a écrit (à propos de Mac en français) :
>
> Je donne l'exemple ubuesque suivant mais bien réel
>
> set z to "+1,5" # si je mets "1.5" la ligne suivante génèrera une erreur
> get (z as number) + 2.3 # si je mets 2,3 j'aurai un refus de compilation

Oh !

> [...]
> Après ça, ne pas s'étonner qu'Applescript, malgré de très bonne choses
> dont la programmation orientée objet, soit quelque peu méprisé par les
> habitués des langages historiques, du Pascal au C, ou même Python, etc.

En effet. Merci de ta réponse. Merci aussi à M.V., je ne fais pas une
réponse séparée mais j'ai bien lu ton dernier article.

--
Olivier Miakinen

Olivier Miakinen

unread,
Mar 4, 2023, 1:16:32 PM3/4/23
to
Le 04/03/2023 à 16:12, M.V. a écrit :
>
> [...]
>
> on replace(str)
> set text item delimiters to "."
> set list1 to every text item of str
> set text item delimiters to decimalSeparator
> set newStr to ("" & list1) as text
> set text item delimiters to ""
> return newStr
> end replace

Je crois que j'ai tout compris. C'est rigolo, l'AppleScript !

> NB J'ai évité la commande « tr » pour rester en AppleScript "pur".

Oui, joli. Maintenant il te reste à ajouter un test au début pour éviter
que "1,5" soit considéré comme une syntaxe valide sur un Mac en français
alors qu'il serait rejeté comme invalide en anglais.

Je parie pour quelque chose comme ça :
if (k as string) contains "," then set invalid_list to invalid_list & k
else
...

--
Olivier Miakinen

Olivier Miakinen

unread,
Mar 4, 2023, 3:34:04 PM3/4/23
to
Le 04/03/2023 à 20:01, M.V. a écrit :
>
>> Maintenant il te reste à ajouter un test au début pour éviter
>> que "1,5" soit considéré comme une syntaxe valide sur un Mac en français
>> alors qu'il serait rejeté comme invalide en anglais.
>
> Bien vu… Je n'avais pas pensé à ça !

;-)

> Mais si on a l'inverse… il faut que "1.5" soit rejeté sur un Mac en
> français alors qu'il serait validé en anglais !

Non, ce n'est pas la peine puisque la syntaxe décrite (qui est standard
partout sauf dans AppleScript) n'utilise que le "." :
<news:tttu3m$1dv4$1...@cabale.usenet-fr.net>

L'idée est vraiment que la syntaxe soit la même partout.

>> Je parie pour quelque chose comme ça :
>> if (k as string) contains "," then set invalid_list to invalid_list & k
>> else
>
> Ça peut être ça en effet. 😜
>
> NB Du point de vue de la syntaxe et s'il y a « else » ça serait :
>
> if (k as string) contains "," then
> set invalid_list to invalid_list & k
> else
> blabla
> end if

Ok. Et il y a forcément un else, pour qu'une chaîne ne soit pas
ajoutée deux fois dans invalid_list (une fois parce qu'elle contient
une virgule, et une deuxième fois parce que même après remplacement
des points par des virgules en français elle reste invalide).

> S'il n'y a pas de else alors ça tient en une seule ligne :
>
> if (k as string) contains "," then set invalid_list to invalid_list & k

Ok. Je ne vais peut-être pas devenir un pro de l'AppleScript moi-même,
mais l'info peut être utile aux utilisateurs de Mac.


--
Olivier Miakinen

Olivier Miakinen

unread,
Mar 4, 2023, 3:38:13 PM3/4/23
to
Le 04/03/2023 à 20:02, "Benoît L." a écrit :
>>
>> Oui, joli. Maintenant il te reste à ajouter un test au début pour éviter
>> que "1,5" soit considéré comme une syntaxe valide sur un Mac en français
>> alors qu'il serait rejeté comme invalide en anglais.
>
> Une remarque : la virgule est utilisée comme séparateur de milliers dans
> le monde anglo-saxon. Il faut donc tester tous les chiffres pour savoir
> si au moins un contient point et virgule, ou s’ils ont tous trois
> chiffres après la virgule auquel cas le résultat à des chances d’être
> bon sauf que le million n’aura pas la sienne.

Même remarque que pour M.V. : une virgule, qu'elle soit décimale ou
séparateur de milliers, ne fait pas partie de la syntaxe décrite dans
<news:tttu3m$1dv4$1...@cabale.usenet-fr.net>. On peut donc déclarer
invalide une chaîne contenant une virgule, quelle que soit la langue
du Mac sur lequel tourne le script.


--
Olivier Miakinen

Olivier Miakinen

unread,
Mar 5, 2023, 6:04:24 AM3/5/23
to
Le 05/03/2023 à 10:54, M.V. a écrit :
>
> else if decimalSeparator is in k then
> set invalid_list to invalid_list & k

Oups ! Sur un Mac configuré en anglais, ou dans toute langue dont le
decimalSeparator est un point, tout nombre non entier sera considéré
comme invalide. ;-)

Cela dit, si le decimalSeparator peut dans certaines langues être
autre chose qu'un point et une virgule, alors tu as raison de ne
pas écrire seulement :

else if "," is in k then

mais peut-être qu'il faudrait :

else if decimalSeparator != "." and decimalSeparator is in k then

--
Olivier Miakinen

Olivier Miakinen

unread,
Mar 5, 2023, 6:36:45 AM3/5/23
to
Le 05/03/2023 à 12:29, Joseph B a écrit :
>
>> Oui, joli. Maintenant il te reste à ajouter un test au début pour éviter
>> que "1,5" soit considéré comme une syntaxe valide sur un Mac en français
>> alors qu'il serait rejeté comme invalide en anglais.
>
> Désolé, mais dans le cadre d'un script Applescript ta demande n'a pas de
> sens : sur un Mac "français" une /entrée numérique textuelle/ DOIT être
> envoyée sous la forme "1,5".*

Sauf que ma demande était indépendante des règles des scripts
Applescript. Il s'agissait de reconnaître la validité d'une chaîne
pour représenter un nombre selon la syntaxe commune à la majorité
des langages de programmation (C, java, javascript, python, etc.),
et la question était de savoir comment écrire en Applescript un
programme sachant reconnaître /cette/ syntaxe qui n'est pas la
sienne.

--
Olivier Miakinen

Olivier Miakinen

unread,
Mar 5, 2023, 10:58:56 AM3/5/23
to
Le 05/03/2023 à 16:02, Joseph B répondait à M.V. :
>>
>> Ceci dit, je crois que l'on a fait le tour, non ?
> Oui, parce que l'exercice de programmation a prouvé que c'était
> faisable, le reste est de s'entendre sur une norme qui fasse consensus.

Je suis d'accord avec vous deux. L'exercice de programmation consistait
à faire en Applescript la même chose que ce que réalise une regexp.
Preuve est faite que c'est possible, même si ce n'est pas forcément
facile.

Au passage j'ai appris des choses amusantes sur le changement de
comportement d'un script selon la langue configurée.

Soit dit en passant, même dans un shell Unix il peut y avoir des
différences quand on fait appel à un programme dont la sortie
dépend de la locale, mais cela se résoud facilement en préfixant
la commande de « LANG=C ». Je ne sais pas si on peut faire la
même chose en Applescript.

Exemple :
=================================================================
$ df
df: /run/user/1000/doc: Opération non permise
Sys. de fichiers blocs de 1K Utilisé Disponible Uti% Monté sur
udev 1931928 0 1931928 0% /dev
...
=================================================================
$ LANG=C df
df: /run/user/1000/doc: Operation not permitted
Filesystem 1K-blocks Used Available Use% Mounted on
udev 1931928 0 1931928 0% /dev
...
=================================================================

--
Olivier Miakinen
0 new messages