8
votes

Modèle de recherche dans la chaîne en utilisant Wildcard à Delphi?

J'ai utilisé pour utiliser une bibliothèque d'hyperstr pour la routine de traitement de chaîne. Maintenant, j'utilise plus New Delphi. J'ai besoin de rechercher un modèle dans une chaîne, par exemple, l'ancienne fonction est iSmatchex (const Source, Recherche: Ansistration; Var Démarrer: Integer): Integer; Code>. En fait, je n'ai pas besoin de la valeur de résultat, je veux juste savoir si le motif correspond à la chaîne ou non.

mon ancien code (retourne vrai): P>

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


3 commentaires

Pense que vous utilisez '.' correspondre à un seul caractère.


Vraiment? MatchSmask Devrait a travaillé. Êtes-vous sûr que votre test était valide?


@Rob, je veux dire les matchsmask ne fonctionne pas dans mon vrai cas. En utilisant le point, mon problème a résolu. Désolé pour une réponse tardive parce que je dois corriger certains codes afin que je puisse essayer la réponse de la MGH.


3 Réponses :


10
votes

La syntaxe d'expression régulière est différente. ? et * ont des significations différentes. Voir http://www.regular-expressions.info/tatudial.html pour une excellente introduction à des expressions régulières. Vous utiliseriez quelque chose d'ABCD [A-Z] F ou ABCD \ WF, ou même une autre syntaxe, selon ce que vous souhaitez faire correspondre.


1 commentaires

+1 pour le lien que vous avez fourni seul. Je suggérerais également que si vous allez passer à tout moment avec Regexes, vous investissez dans une copie de Regexbuddy . C'est un outil inestimable pour créer et tester des expressions régulières. (Non affilié de quelque manière que ce soit - juste un client très heureux depuis des années maintenant.)



7
votes

Si? Représenter un seul caractère: xxx

si? Représenter n'importe quelle piqûre: xxx

ne pas avoir xe donc pas testé.


7 commentaires

Méfiez-vous du point ...;) régulier-expressions.info/dot.html , par exemple, cela correspondrait à ABCDEF, mais il correspondrait également à ABCD, F ABCD / F, ABCD (F, etc. Regex peut utiliser une syntaxe plus puissante pour obtenir exactement ce que vous devez faire correspondre.


@utilisateur '.' Ne correspondez pas si vous avez des caractèresWLINE, je pense que vous devez utiliser '[. \ N \ r]' à la place de '.' '


Hmm .. je pense qu'il n'y aura pas de nouvelle ligne. L'entrée est une chaîne hexagonale d'un fichier. D'une manière ou d'une autre, je pense que mon strohex a un résultat invalide, je dois donc la corriger d'abord et il est temps de rentrer chez vous! :)


Avec une entrée hexagone, vous voulez probablement utiliser la suggestion de Lddandon, pour correspondre à ce que vous voulez réellement. [0-9A-FA-F] * devrait correspondre à hexagone.


Le masque du premier exemple ne devrait-il pas être "ABCD?" plutôt que 'abcd.f'?


@drumzeuch 'abcd.?' accepterait la piqûre 'ABCD' puis éventuellement un autre caractère. Donc non, cela ne devrait pas être le masque autant que je comprenne la question initiale. Vous pouvez utiliser «ABCD.?F» si le point d'interrogation dans la question représente un caractère unique en option.


@MGh Désolé, j'ai dû être une mauvaise journée. Ce que j'ai écrit était des ordures.



2
votes

Vous pouvez utiliser le masque pour correspondance générique: xxx

ismatch = true (Code de constructeur C ++ est simplement transversal à Pascal)


0 commentaires