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

[HC] Expression reguliere

26 réponses
Avatar
Sam Vimaire
Hello.

Je ne parviens pas à trouver le groupe le plus approprié pour poser ma
question. Désole pour le Hors-Charte, peut-etre quelqu'un saura t'il me
rediriger (voir me répondre).

Expression réguliere:
Il ya a t'il une syntaxe pour "tout sauf"

Quelle serait par exemple l'expression réguliere pour rechercher dans
la liste suivante les chaines avec un autre caractère que B à la
seconde place (tout sauf B)
AED
BBC
ZRE

resultat souhaité : 1ere occurrence AED, 2eme occurence ZRE

Merci pour vos réponses.

10 réponses

1 2 3
Avatar
Olivier Miakinen
Le 01/08/2008 17:45, Pascal J. Bourguignon a écrit :

Bien vu. Merci pour ce rapport de bogue!
Il faut ajouter une * (un ? irait aussi) pour que ça marche bien:

^[^Mcfiorst]*([^M]*|M([^i]*|i([^c]*|c([^r]*|r([^o]*|o([^s]*|s([^o]*|o([^f]*|f[^t]*))))))))[^Mcfiorst]*$



Ça ne marche toujours pas comme il faut, même si je ne comprends pas
bien ce qui se passe.

MicroMicro : vrai (normal)
MicroMicros : faux (ce n'est pas ce que l'on veut)

Je vais essayer de l'améliorer.
Avatar
Olivier Miakinen
Le 01/08/2008 17:59, je répondais à Pascal :

^[^Mcfiorst]*([^M]*|M([^i]*|i([^c]*|c([^r]*|r([^o]*|o([^s]*|s([^o]*|o([^f]*|f[^t]*))))))))[^Mcfiorst]*$



MicroMicro : vrai (normal)
MicroMicros : faux (ce n'est pas ce que l'on veut)



iM : faux (ça devrait être vrai)
Avatar
Olivier Miakinen
Le 01/08/2008 17:59, Olivier Miakinen a écrit :

Je vais essayer de l'améliorer.



J'ai essayé ceci :
^([^M]|M([^i]|$)|Mi([^c]|$)|Mic([^r]|$)|Micr([^o]|$)|Micro([^s]|$)|Micros([^o]|$)|Microso([^f]|$)|Microsof([^t]|$))*$

Malheureusement ça ne marche pas non plus lorsque le mot Microsoft
suit immédiatement le début du même mot, par exemple MicroMicrosoft.
En effet, le deuxième M est mangé par le [^s], ce qui empêche de
reconnaître le Microsoft qui suit.

Finalement, le mieux c'est quand même :
^((?!Microsoft).)*$
Avatar
Jean-Marc Bourguet
(Pascal J. Bourguignon) writes:

Olivier Miakinen <om+ writes:

> Le 01/08/2008 14:52, Pascal J. Bourguignon a écrit :
>>
>> ^[^Mcfiorst]*([^M]*|M([^i]*|i([^c]*|c([^r]*|r([^o]*|o([^s]*|s([^o]*|o([^f]*|f[^t]))))))))[^Mcfiorst]*$
>>
>> est une expression régulière qui reconnait toute chaine ne contenant
>> pas la sous-chaine "Microsoft".
>
> Tu en es sûr ? Teste-la donc avec une chaîne se terminant par
> « Microsof » pour voir...

Bien vu. Merci pour ce rapport de bogue!
Il faut ajouter une * (un ? irait aussi) pour que ça marche bien:

^[^Mcfiorst]*([^M]*|M([^i]*|i([^c]*|c([^r]*|r([^o]*|o([^s]*|s([^o]*|o([^f]*|f[^t]*))))))))[^Mcfiorst]*$



Il en suffit d'une a la fin (et tu peux virer -- sauf peut-etre perf sur un
moteur ou l'autre non base sur les FSM) les [^Mcfiorst].

Derivation incrementale
N'importe quoi
^.*$
qui ne contient pas M
^[^M]*$
pas Mi
^([^M]|M[^i])*$
pas Mic
^([^M]|M([^i]|i[^c]))*$
pas Micr
^([^M]|M([^i]|i([^c]|c[^r])))*$
pas Micro
^([^M]|M([^i]|i([^c]|c([^r]|r[^o]))))*$
pas Micros
^([^M]|M([^i]|i([^c]|c([^r]|r([^o]|o[^s])))))*$
pas Microso
^([^M]|M([^i]|i([^c]|c([^r]|r([^o]|o([^s]|s[^o]))))))*$
pas Microsof
^([^M]|M([^i]|i([^c]|c([^r]|r([^o]|o([^s]|s([^o]|o[^f])))))))*$
pas Microsoft
^([^M]|M([^i]|i([^c]|c([^r]|r([^o]|o([^s]|s([^o]|o([^f]|f[^t]))))))))*$

Derivation alternative, plus facile a taper directement le resultat final
(qui ne differe que par commutation autour des | du resultat final
ci-dessus): il n'y a pas une foule de ) qui se suivent.
^(Microsof[^t])*$
^(Microso(f[^t]|[^f]))*$
^(Micros(o(f[^t]|[^f])|[^o]))*$
^(Micro(s(o(f[^t]|[^f])|[^o])|[^s]))*$
^(Micr(o(s(o(f[^t]|[^f])|[^o])|[^s])|[^o]))*$
^(Mic(r(o(s(o(f[^t]|[^f])|[^o])|[^s])|[^o])|[^r]))*$
^(Mi(c(r(o(s(o(f[^t]|[^f])|[^o])|[^s])|[^o])|[^r])|[^c]))*$
^(M(i(c(r(o(s(o(f[^t]|[^f])|[^o])|[^s])|[^o])|[^r])|[^c])|[^i]))*$
^(M(i(c(r(o(s(o(f[^t]|[^f])|[^o])|[^s])|[^o])|[^r])|[^c])|[^i])|[^M])*$

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
Avatar
Fabien LE LEZ
On 01 Aug 2008 18:27:39 +0200, Jean-Marc Bourguet :

Derivation incrementale



Puisqu'on est, malgré les apparences, sur fclc++, aurais-tu moyen de
créer une fonction capable de transformer une chaîne ("Microsoft"), en
la regex associée (compatible avec Boost bien sûr) ?
Avatar
Olivier Miakinen
Le 01/08/2008 18:27, Jean-Marc Bourguet a écrit :

Derivation incrementale
[...]
pas Microsoft
^([^M]|M([^i]|i([^c]|c([^r]|r([^o]|o([^s]|s([^o]|o([^f]|f[^t]))))))))*$



M : faux

Derivation alternative, [...]
^(M(i(c(r(o(s(o(f[^t]|[^f])|[^o])|[^s])|[^o])|[^r])|[^c])|[^i])|[^M])*$



M : faux


^((?!Microsoft).)*$

M: vrai
Avatar
Jean-Marc Bourguet
Fabien LE LEZ writes:

On 01 Aug 2008 18:27:39 +0200, Jean-Marc Bourguet :

>Derivation incrementale

Puisqu'on est, malgré les apparences, sur fclc++, aurais-tu moyen de
créer une fonction capable de transformer une chaîne ("Microsoft"), en
la regex associée (compatible avec Boost bien sûr) ?



Pour la negation je suppose?

#include <iostream>
#include <ostream>
#include <string>

std::string regexpquote(char c)
{
// TBD
return std::string(1, c);
}

std::string regexpnegator(std::string const& s)
{
if (s.size() == 0) {
return ".*";
} else if (s.size() == 1) {
return std::string("[^") + regexpquote(s[0]) + "]*";
} else {
std::string result;
for (int i = 0; i < s.size()-1; ++i) {
result += "(";
result += regexpquote(s[i]);
}
result += "[^";
result += regexpquote(s[s.size()-1]);
result += "]";
for (int i = s.size()-1; i-- > 0; ) {
result += "|[^";
result += regexpquote(s[i]);
result += "])";
}
result += "*";
return result;
}
}

int main(int argc, char** argv)
{
for (int i = 1; i < argc; ++i) {
std::cout << argv[i] << "-> " << regexpnegator(argv[i]) << std::endl;
}
}

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
Avatar
Olivier Miakinen
Le 01/08/2008 18:50, Jean-Marc Bourguet a écrit :

Puisqu'on est, malgré les apparences, sur fclc++, aurais-tu moyen de
créer une fonction capable de transformer une chaîne ("Microsoft"), en
la regex associée (compatible avec Boost bien sûr) ?



Pour la negation je suppose?

#include <iostream>
#include <ostream>
#include <string>

[...]

int main(int argc, char** argv)
{
for (int i = 1; i < argc; ++i) {
std::cout << argv[i] << "-> " << regexpnegator(argv[i]) << std::endl;
}
}




#include <iostream>
#include <ostream>
#include <string>

int main(int argc, char** argv)
{
for (int i = 1; i < argc; ++i) {
std::cout << argv[i] << " -> " << "^((?!" << argv[i]
<< ").)*$" << std::endl;
}
}

;-)
Avatar
Jean-Marc Bourguet
Olivier Miakinen <om+ writes:

Le 01/08/2008 18:27, Jean-Marc Bourguet a écrit :
>
> Derivation incrementale
> [...]
> pas Microsoft
> ^([^M]|M([^i]|i([^c]|c([^r]|r([^o]|o([^s]|s([^o]|o([^f]|f[^t]))))))))*$

M : faux

> Derivation alternative, [...]
> ^(M(i(c(r(o(s(o(f[^t]|[^f])|[^o])|[^s])|[^o])|[^r])|[^c])|[^i])|[^M])*$

M : faux



Heureusement, c'est deux fois la meme organisee differemment.

Ca plante sur les chaines qui se terminent par un prefixe de Microsoft.
L'automate est facile a fixer, l'exprimer sous forme de regexp, je ne vois
pas.


--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
Avatar
Jean-Marc Bourguet
Jean-Marc Bourguet writes:

Olivier Miakinen <om+ writes:

> Le 01/08/2008 18:27, Jean-Marc Bourguet a écrit :
> >
> > Derivation incrementale
> > [...]
> > pas Microsoft
> > ^([^M]|M([^i]|i([^c]|c([^r]|r([^o]|o([^s]|s([^o]|o([^f]|f[^t]))))))))*$
>
> M : faux
>
> > Derivation alternative, [...]
> > ^(M(i(c(r(o(s(o(f[^t]|[^f])|[^o])|[^s])|[^o])|[^r])|[^c])|[^i])|[^M])*$
>
> M : faux

Heureusement, c'est deux fois la meme organisee differemment.

Ca plante sur les chaines qui se terminent par un prefixe de Microsoft.
L'automate est facile a fixer, l'exprimer sous forme de regexp, je ne vois
pas.



Je suis stupide, mettre (M(i(c(r(o(s(of?)?)?)?)?)?)?)? en
suffixe. Mais je ne vois toujours rien sans repeter une troisieme fois les
lettres du mot.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
1 2 3