Matchesmask et les expressions régulières.

Soyez le premier à donner votre avis sur cette source.

Vue 10 490 fois - Téléchargée 629 fois

Description

A part MaskEdit, on ne peut pas dire que Delphi nous offre beaucoup d'outils pour s'initier aux expressions régulières.
Il existe cependant une fonction méconnue, MatchesMask, qui permet de faire des choses intéressantes.
Voici un petit exemple d'utilisation de cette fonction. Cet exemple permet d'extraire des adresses IP ou des N° de téléphone à partir d'un texte quelconque.
MatchesMask nous permet de faire une recherche dans un String par dichotomie. Méthode beaucoup plus rapide qu'une recherche classique qui balaie toute la String.
MatchesMask a cependant un inconvénient. C'est qu'elle n'offre pas toute la souplesse proposée par les expressions régulières des autres langages. Par contre, elle a un avantage: c'est que le masque est très simple à mettre en oeuvre et permet ainsi un début d'initiation facile aux regexp...

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
66
mon prog doit exister en delphi, .net, etc.

ce genre de choses :
((expr1)|(expr2)
@Delphiprog: Il ne s'agit pas de *froissage* d'esprit, ou de tout autre artefact mais plus d'un débat quand à la meilleure méthode pour effectuer ce genre de recherche.
Dans ce contexte, ta remarque est tout à fait la bienvenue. En plus, les liens que tu cites sont à la fois intéressants et complets.

@Renfield: ton programme a l'air drôlement utile. Seul ennui: c'est du VB ! Comment on fait pour s'en servir ? Tu fournis l'exe mais il manque toujours les ocx pour que ça veuille bien démarrer.

Sinon, toujours pour rester dans le domaine des regexp, on a toujours le même problème : si j'ai ^(expression1|expression2)$, comment je sais laquelle des deux sous-expressions à été matchée ?
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
66
ta regexp ne me convient pas tout a fait. Elle décrit :

255
comme étant une IP valide...

de plus, si je testes:
192.168.1.204

le '4' n'est pas dans le match

http://www.vbfrance.com/codes/REGEXP-WORKSHOP_17331.aspx
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
29
Mille excuses à vous deux mais je n'avais pas l'intention de froisser les esprits. Je sais fort bien que Caribensila n'est pas du genre à poster des codes à deux balles. Qu'il me pardonne s'il s'est senti offensé et je lui ferai parvenir une tarte au concombre pour me faire pardonner. :o)
Le message que j'ai voulu faire passer est l'intérêt, sur le long terme, de se pencher sur l'étude des expressions régulières du fait qu'elle sont disponibles dans quasiment tous les langages et presque universelles (différentes normes existent).
Le temps passé à écrire la fonction postée ici aurait été bien moindre avec les expressions régulières.
Le fait d'utiliser telle ou telle bibliothèque importe peu du moment que la bibliothèque en question respecte les normes "industrielles".

@florenth : pour info, voici l'expression que j'utilise pour valider une adresse IP V4 :
^(([01]?\d\d?|2[0-4]\d|25[0-5])\.){3}[01]?\d\d?|2[0-4]\d|25[0-5]$

Ceci démontre, par la même occasion, qu'il n'y a pas qu'une vérité et qu'on peut parvenir au résultat recherché de différentes manières.
Désolé, mais je n'ai pas mis de commentaire dans cette expression régulière.
Pour finir, je suis entièrement d'accord avec vous deux pour dire que la fonction MatchesMask est très largement méconnue et donc, à fortiori, sous utilisée. C'est bien dommage et merci à Caribensila de l'avoir remise au goût du jour.
Au fait Cari, pourquoi MatchesMask pour trouver une IP ?
Je n'y avais pas pensé avant, mais c'est super simple :




Matériel: un TEdit, un TButton et un TMemo
--------------------------------------------------------------------
function ParseString(const S: string; var Position: Integer;
AllowedChars: TSysCharSet): string;
var
Debut: Integer;
begin
Debut := Position;
while (Position <= Length(S)) and (S[Position] in AllowedChars) do
Inc(Position);
Result := Copy(S, Debut, Position - Debut);
end;

type
TIPAddr = array[0..3] of Byte;

function IsValidIP(const S: string; out IPAddr: TIPAddr): Boolean;
var
Num, Position, TempI: Integer;
begin
Result := False;
Position := 1;
for Num := 0 to 3 do
begin
TempI := StrToIntDef(ParseString(S, Position, ['0'..'9']), -1);
if not (TempI in [0..255]) then
Exit;
IpAddr[Num] := TempI;
if (Num <> 3) and (S[Position] <> '.') then
Exit;
Inc(Position);
end;
Result := Position > Length(S);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
IP: TIPAddr;
I: Integer;
begin
if IsValidIP(Edit1.Text, IP) then
begin
Memo1.Clear;
Memo1.Lines.Add('IP Valide');
for I := 0 to 3 do
Memo1.Lines.Add(IntToStr(IP[I]));
end
else
Memo1.Text := 'IP non valide';
end;
--------------------------------------------------------------------

Alors, qu'en penses-tu ?

Et puis dis moi, tu vas pas t'arrêter là maintenant que tu t'y est lancé ! Pour la semaine prochaine, un petit exemple avec une regex, ça te tente pas ?? ;-)

PS: mon exemple n'est pas "gerbant", c'est juste que à part celui qui l'a écrit (donc moi), les autres vont mettre du temps à comprendre le pourquoi du comment.
Quoi que à ce qu'il parait, on peut mettre des commentaires dans les regex...
Afficher les 10 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.