Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

problème avec expression régulière

8 réponses
Avatar
mc31
Bonjour =E0 tous,

Je souhaiterais utiliser les expressions r=E9guli=E8res (API regex JDK
1=2E4) pour remplacer le caract=E8re '.' par le caract=E8re '#' dans une
cha=EEne de caract=E8re.

Je souhaiterais avoir le comportement suivant:

a=2Eb -> a#b
a=2Eb.c -> a#b#c
mais
a=2E.b -> a..b (inchang=E9)

J'ai essay=E9 plusieurs expressions r=E9guli=E8res suivantes:
Pattern p =3D Pattern.compile("\\.{1}")
Pattern p =3D Pattern.compile("(.)")
.=2E.
mais sans succ=E8s.

Existe il une expression r=E9guli=E8re adapt=E9e ?
Merci d'avance pour vos r=E9ponses

Marie

8 réponses

Avatar
Insitu
"mc31" writes:

Bonjour à tous,

Je souhaiterais utiliser les expressions régulières (API regex JDK
1.4) pour remplacer le caractère '.' par le caractère '#' dans une
chaîne de caractère.

Je souhaiterais avoir le comportement suivant:

a.b -> a#b
a.b.c -> a#b#c
mais
a..b -> a..b (inchangé)

J'ai essayé plusieurs expressions régulières suivantes:
Pattern p = Pattern.compile(".{1}")
Pattern p = Pattern.compile("(.)")
...
mais sans succès.

Existe il une expression régulière adaptée ?


Peut-etre
([^.].)*
pour capturer le pattern a.

Par contre, pour effectuer le remplacement dans la chaine, il ne'est
pas possible de le faire directement avec une regex, il faut utiliser
l'API matcher.
voir
http://java.sun.com/j2se/1.5.0/docs/api/java/util/regex/Matcher.html#appendReplacement(java.lang.StringBuffer,%20java.lang.String)

insitu.

Avatar
cfranco
mc31 wrote:

Je souhaiterais avoir le comportement suivant:

a.b -> a#b
a.b.c -> a#b#c
mais
a..b -> a..b (inchangé)

J'ai essayé plusieurs expressions régulières suivantes:
Pattern p = Pattern.compile(".{1}")
Pattern p = Pattern.compile("(.)")
...
mais sans succès.

Existe il une expression régulière adaptée ?


Personnellement, je ne me casserais pas la tête, un truc comme ça je le
ferais spontanément en 2 temps et 3 mouvements :

1e étape : .. -> ZORGLUB
2e étape : . -> #
3e étape : ZORGLUB -> ..

(quand je dis ZORGLUB, bien sûr tu peux mettre ce que tu veux, un unique
caractère si tu veux, pourvu qu'il ne se retrouve nulle part ailleurs
dans la chaîne de caractères que tu veux modifier)

--
Christophe Franco

Avatar
Zazoun
On Jan 17, 3:28 pm, Insitu wrote:
"mc31" writes:
Bonjour à tous,

Je souhaiterais utiliser les expressions régulières (API regex JDK
1.4) pour remplacer le caractère '.' par le caractère '#' dans une
chaîne de caractère.

Je souhaiterais avoir le comportement suivant:

a.b -> a#b
a.b.c -> a#b#c
mais
a..b -> a..b (inchangé)

J'ai essayé plusieurs expressions régulières suivantes:
Pattern p = Pattern.compile(".{1}")
Pattern p = Pattern.compile("(.)")
...
mais sans succès.

Existe il une expression régulière adaptée ?Peut-etre
([^.].)*

pour capturer le pattern a.

Par contre, pour effectuer le remplacement dans la chaine, il ne'est
pas possible de le faire directement avec une regex, il faut utiliser
l'API matcher.
voirhttp://java.sun.com/j2se/1.5.0/docs/api/java/util/regex/Matcher.html# ...)

insitu.


Eh si c'est possible ! Il faut utiliser le pattern :
"(?<!.).(?!.)", c'est-à-dire : un "." qui n'est ni suivi ni
précédé par un ".".


Avatar
Maxime Daniel
...
Eh si c'est possible ! Il faut utiliser le pattern :
"(?<!.).(?!.)", c'est-à-dire : un "." qui n'est ni suivi ni
précédé par un ".".
Bien joué !

En revanche, à moins que le nombre d'invocations soit réduit, donc
que les performances ne soient pas problématiques, je taperais
personnellement directement dans une machine à états qui va bien.

Avatar
Hervé AGNOUX
Maxime Daniel wrote:

Bien joué !
En revanche, à moins que le nombre d'invocations soit réduit, donc
que les performances ne soient pas problématiques, je taperais
personnellement directement dans une machine à états qui va bien.


Mais... les regexps ne sont pas traduites en machine à états, au final ??

Si non, elles sont traduites en quoi, alors ?

Si oui, qu'est-ce que cela apporterait de plus, à fonctionnement
équivalent ?


--
Hervé AGNOUX
http://www.diaam-informatique.com

Avatar
Insitu
"Zazoun" writes:


Eh si c'est possible ! Il faut utiliser le pattern :


Le "possible" s'appliquait au remplacement, pas à la définition d'une
expression.

insitu.

Avatar
Zazoun
Eh si c'est possible ! Il faut utiliser le pattern :Le "possible" s'app liquait au remplacement, pas à la définition d'une
expression.



Au temps pour moi si j'avais mal compris. En tout cas, une fois
l'expression régulière définie, on peut utiliser simplement la
méthode String.replaceAll(...) (qui elle-même utilise Matcher et
Pattern de toutes façons)


Avatar
Maxime Daniel
Maxime Daniel wrote:

Bien joué !
En revanche, à moins que le nombre d'invocations soit réduit, donc
que les performances ne soient pas problématiques, je taperais
personnellement directement dans une machine à états qui va bien.


Mais... les regexps ne sont pas traduites en machine à états, au fina l ??

Il y a plusieurs classes de machines à états, même pour des

expressions lexicales (l'analyse des expressions syntaxiques implique
le plus souvent des machines à piles). Par ailleurs, la technique
normale pour des expressions fournies à runtime consiste à faire
travailler un moteur générique et invariant sur des tables qui,
elles, reflètent l'expression particulière considérée. de sorte
que, pour un cas simpliste comme celui exposé, et s'il s'agit d'un
besoin isolé, on gagnera à implanter une machine à états dédiée
et optimisée.
Si non, elles sont traduites en quoi, alors ?

A priori donc, et sans avoir regardé l'implantation dans la

bibliothèque, elles sont traduites en un paramétrage d'une machine à
états générique.
Si oui, qu'est-ce que cela apporterait de plus, à fonctionnement
équivalent ?

Des performances.

Lorsque l'expression ou l'ensemble d'expressions considérés sont
complexes, l'utilisation d'un moteur générique ayant bénéficié
d'un effort important tant au point de vue de la théorie que de
l'implantation, et des algorithmes d'optimisation des paramètres
associés (minimisation du nombre d'états par réduction des
sous-graphes similaires, techniques de codages à indirections comme
dans lex, etc.) amènent un gain par rapport à ce que le programmeur
peut espérer atteindre avec un effort raisonnable. Le premier gain est
d'ailleurs la réduction du nombre d'erreurs potentielles. Mais dans le
cas simpliste et évident, le codage manuel est à la fois raisonnable
en termes de coût et de risque, et optimal en temps et espace.
C'est un peu le même arbitrage qu'entre l'utilisation de la
calculatrice et l'utilisation du tableur. Au-delà d'une certaine
complexité et d'un certain volume, le tableur apporte des avantages
indéniables. Mais pour une opération toute simple, la calculatrice
est plus commode et plus rapide.

--
Hervé AGNOUX
http://www.diaam-informatique.com