Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Match funktion? (https://www.delphipraxis.net/45125-match-funktion.html)

Pseudemys Nelsoni 30. Apr 2005 07:13


Match funktion?
 
Moin,

hat jemand eine Idee wie ich eine Funktion schreiben könnte die 2 strings auf übereinstimmung prüft?
Als Joke sollen * und ? benutzt werden koennen.

Das heisst das wenn die Maske z.b:

Zitat:

???
ist, das Wort 3 Zeichen haben muss und bei:

Zitat:

blah*irgendwas
muss der string auf jedenfall mit "blah" beginnen und mit "irgendwas" enden.

Jemand ne Idee?

die MatchesMask() Funktion geht hierfür nicht, da der Joker "?" dort heisst das ein Zeichen vorkommen KANN, aber nicht MUSS.... ich brauch aber das "muss".

malo 30. Apr 2005 07:16

Re: Match funktion?
 
Eine Möglichkeit wäre, dass man mit einer Schleife bei jedem "*" alle 255 ACII-Codes einsetzt und dann prüft. ;)

MathiasSimmack 30. Apr 2005 07:27

Re: Match funktion?
 
Zitat:

Zitat von Pseudemys Nelsoni
hat jemand eine Idee wie ich eine Funktion schreiben könnte die 2 strings auf übereinstimmung prüft?
Als Joke sollen * und ? benutzt werden koennen.

Wenn das so bleibt, dann kannst du ja mal die Shell-Funktion MSDN-Library durchsuchenPathMatchSpec zweckentfremden, so wie ich das auch mache. Die ist eigentlich dazu da, zu prüfen, ob ein Ordner- oder Dateiname einem bestimmten Wildcard entspricht. Wenn du allerdings andere Strings übergibt, dann stört sie sich auch nicht daran. Hier die Deklarationen:
Delphi-Quellcode:
function PathMatchSpec(pszFile, pszSpec: PAnsiChar): bool; stdcall;

const
  shlwapi = 'shlwapi.dll';

function PathMatchSpec; external shlwapi name 'PathMatchSpecA';
Code:
[DllImport("shlwapi.dll")]
static extern bool PathMatchSpec(string pwszFile, string pwszSpec);
wobei mich in dem Zusammenhang gleich interessieren würde, ob es eine im .NET Framework eingebaute Möglichkeit gibt. Das Einbinden der API-Funktion (s. zweiter Codeauszug) ist zwar bequem und funktioniert, aber auf lange Sicht ist sie fürs .NET Framework doch eher ungeeignet. Und reguläre Ausdrücke sind gleich ein bisschen zu dick.

Wie dem auch sei, Anwendungsmöglichkeit:
Delphi-Quellcode:
if PathMatchSpec('blahierstehteinvölligsinnloserstringirgendwas','bla*irgendwas') then
  ShowMessage('Passt');

if PathMatchSpec('abc','???') then
  ShowMessage('Passt');

mirage228 30. Apr 2005 10:02

Re: Match funktion?
 
Hi Mathias,

Also in .NET könntest Du doch einfach mit regulären Ausdrücken arbeiten - so "dick" sind die ja nun auch nicht.
Selbst wenn im Ausgangstring nur ein "*" ist, könnte man das doch problemlos in ein "(.*)" umwandeln und damit könnte man auch mit Windows ähnlichen Wildcards arbeiten.

mfG
mirage228

Christian Seehase 30. Apr 2005 22:43

Re: Match funktion?
 
Moin Mathias,

eine kleine Einschränkung für die "Zweckentfremdung" sollte aber nicht unerwähnt bleiben:
Der erste Parameter darf maximal MAX_PATH Byte lang sein (MAX_PATH = 260)

Robert_G 30. Apr 2005 22:53

Re: Match funktion?
 
Zitat:

Zitat von mirage228
Also in .NET könntest Du doch einfach mit regulären Ausdrücken arbeiten - so "dick" sind die ja nun auch nicht.

Wenn man es geschickt anstellt sind sie überhaupt nicht "dick".
Einfach von Regex ableten und eine versteckte statische Liste führen.
Der Constructor wird versteckt und nach außen ist nur ein GetInstance sichtbar, dass einen RegEx string schluckt und eine Instanz deiner Klasse auspuckt.
Jetzt braucht er in der internen List nur noch eine Regex mit dem string suchen (für die Liste wäre eine HashTable ganz nett ;) ) die Instanz zurückgeben oder eine neue Instanz für den string anlegen, kompilieren ( :!: ), in die Liste schmeißen und zurückgeben.

Auf die Art hast du sackschnelle, kompiliere RegEchsen OHNE dass dir die Kompilierung die Zyklen vom Kopf frisst (wird ja nur einmal pro pattern gemacht :) ).

Dax 30. Apr 2005 22:57

Re: Match funktion?
 
Um mal was zu fragen.. ich mag .NET ja auch, und Robert ist ganz klar der Guru ;) Aber.. @Robert, was hast du grade gesagt? :gruebel: Liegts vielleicht daran, das es so spät ist? Ich kapiers irgendwie nicht :(

Robert_G 30. Apr 2005 23:05

Re: Match funktion?
 
Zitat:

Zitat von Dax
Liegts vielleicht daran, das es so spät ist? Ich kapiers irgendwie nicht :(

Du kannst RegExen in .Net kompilieren...
Dumm ist nur, dass er jede Regex Instanz kompiliert (und nebenbei eine temporäre Assembly anlegt :? ) egal, ob es nicht schon eine kompilierte Regex für dieses pattern gibt.
Wenn du eine private statische HashTable (Key: pattern / Value: DeinRegex) führst, kannst du doch darin nachschauen, ob du für dieses pattern schon eine kompilierte Regex "rumliegt".
Um zu verhindern, dass du dich aus Versehen an dem Mechanismus vorbeimogelst sollte der Constructor private sein. Öffentlich wäre dann nur ein
Code:
public static DeinRegex CreateInstance(string pattern)
.
Bin gerade etwas in Eile... wenn ich's diesmal nicht genau erklären konnte... Pech gehabt. :P

nachtrag: "static" vergessen...

Dax 30. Apr 2005 23:06

Re: Match funktion?
 
Nein, das reicht schon, habs verstanden :kiss:

Muetze1 1. Mai 2005 00:28

Re: Match funktion?
 
Moin!

/EDIT: ok, hat sich erledigt - einen kleinen Satz überlesen...

MfG
Muetze1


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:46 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz