![]() |
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:
Zitat:
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". |
Re: Match funktion?
Eine Möglichkeit wäre, dass man mit einer Schleife bei jedem "*" alle 255 ACII-Codes einsetzt und dann prüft. ;)
|
Re: Match funktion?
Zitat:
![]()
Delphi-Quellcode:
function PathMatchSpec(pszFile, pszSpec: PAnsiChar): bool; stdcall;
const shlwapi = 'shlwapi.dll'; function PathMatchSpec; external shlwapi name 'PathMatchSpecA';
Code:
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.
[DllImport("shlwapi.dll")]
static extern bool PathMatchSpec(string pwszFile, string pwszSpec); Wie dem auch sei, Anwendungsmöglichkeit:
Delphi-Quellcode:
if PathMatchSpec('blahierstehteinvölligsinnloserstringirgendwas','bla*irgendwas') then
ShowMessage('Passt'); if PathMatchSpec('abc','???') then ShowMessage('Passt'); |
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 |
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) |
Re: Match funktion?
Zitat:
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 :) ). |
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 :(
|
Re: Match funktion?
Zitat:
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... |
Re: Match funktion?
Nein, das reicht schon, habs verstanden :kiss:
|
Re: Match funktion?
Moin!
/EDIT: ok, hat sich erledigt - einen kleinen Satz überlesen... MfG Muetze1 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:06 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz