2011-05-13 5 views
6

J'avais l'habitude d'utiliser la bibliothèque HYPERSTR pour la routine de traitement de chaîne. Maintenant, j'utilise Delphi plus récent. J'ai besoin de rechercher un motif dans une chaîne, par exemple l'ancienne fonction est function IsMatchEx(const Source, Search:AnsiString; var Start:integer) : Integer;. En fait, je n'ai pas besoin de la valeur du résultat, je veux juste savoir si le motif correspond à la chaîne ou non.Rechercher un motif dans une chaîne en utilisant un caractère générique dans Delphi?

Mon ancien code (retourne TRUE en cas):

var 
    StartPos: integer; 
    FoundPos: integer; 
begin 
    StartPos := 1; 
    FoundPos := IsMatchEx('abcdef', 'abcd?f', StartPos); 
    if FoundPos > 0 then 
    showmessage('match'); 
end; 

Je vois que Delphi XE a TRegEx mais je stil ne comprennent pas l'utiliser.

Ce code ne retourne pas TRUE:

if TRegEx.IsMatch('abcdef', 'abcd?f') then 
    showmessage('match'); 

J'ai aussi eu même résultat lors de l'utilisation MatchesMask.

Merci.

+2

utiliser pensez que vous. ' pour correspondre à un seul caractère. – MGH

+0

Vraiment? MatchesMask * devrait * avoir travaillé. Êtes-vous sûr que votre test était valide? –

+0

@Rob, je veux dire MatchesMask ne fonctionne pas dans mon cas réel. En utilisant le point, mon problème a résolu. Désolé pour la réponse tardive parce que je dois corriger quelques codes afin que je puisse essayer la réponse de l'HGM. – user

Répondre

4

si? représentent un seul caractère:

if TRegEx.IsMatch('abcdef', 'abcd.f') then 
    showmessage('match'); 

si? représente toute piqûre:

if TRegEx.IsMatch('abcdef', 'abcd.*f') then 
    showmessage('match'); 

Ne pas avoir XE donc ne pas avoir testé.

+1

Méfiez-vous du point ...;) http://www.regular-expressions.info/dot.html, par exemple, il correspondrait à abcdef, Regex peut utiliser une syntaxe plus puissante pour obtenir exactement ce dont vous avez besoin: –

+0

@MGH, cela fonctionne dans mon exemple mais pas dans mon vrai code. wait .. – user

+0

@user '.' ne correspond pas si vous avez des caractères de nouvelle ligne je pense, alors vous devez utiliser '[. \ n \ r]' à la place de '.' – MGH

9

La syntaxe d'expression régulière est différente. ? et * ont des significations différentes. Voir http://www.regular-expressions.info/tutorial.html pour une excellente introduction aux expressions régulières. Vous utiliseriez quelque chose comme abcd [a-z] f ou abcd \ wf, ou même une autre syntaxe, selon ce que vous voulez faire correspondre.

+1

+1 pour le lien que vous avez fourni seul. Je suggère également que si vous allez passer du temps avec les regex, vous investissez dans une copie de [RegExBuddy] (http://regexbuddy.com). C'est un outil inestimable pour créer et tester des expressions régulières. (Pas affilié en aucune façon - juste un client très heureux depuis des années maintenant.) –

0

Vous pouvez utiliser TMask pour la correspondance wildchar:

TMask *m = new TMask("String to check"); 
bool isMatch = m->Matches("string to*"); 
delete m; 

isMatch = true (code C++ Builder est tout simplement translable Pascal)

Questions connexes