Wie sagst du, ob sich zwei Wildcards überschneiden?

8

Wenn zwei Strings mit * Wildcards angegeben sind, würde ich gerne wissen, ob eine Zeichenkette erstellt werden könnte, die beiden entspricht.

Zum Beispiel sind diese beiden Fälle ein einfacher Überlappungsfall:

  1. Hallo * Welt
  2. Hel *

Aber das sind auch alle:

  1. * .csv
  2. Berichte * .csv
  3. reportsdump.csv

Gibt es dafür einen Algorithmus? Oder vielleicht eine Dienstprogrammfunktion in Windows oder einer Bibliothek, die ich aufrufen oder kopieren könnte?

    
Tom Ritter 12.05.2010, 18:05
quelle

4 Antworten

5

Da jeder glob als regulärer Ausdruck geschrieben werden kann und der Schnittpunkt zweier regulärer Ausdrücke gefunden werden kann (sofern sie nicht wirklich regulär sind, aber in diesem Fall wären sie), können Sie den Schnittpunkt zweier Globs durch finden sie in reguläre Ausdrücke umwandeln und dann die Schnittmenge von diesen finden. So können Sie herausfinden, ob sich zwei Globs schneiden, indem Sie den Schnittpunkt der regulären Ausdrücke finden und prüfen, ob dieser leer ist.

Da jedoch Globs begrenzter als regulärer Ausdruck sind, gibt es einen viel leichteren Weg:

Nennen wir die zwei Globs g1 und g2. Sie schneiden sich iff

  1. Sowohl g1 als auch g2 sind leer oder enthalten nur Platzhalter.
  2. Weder g1 noch g2 sind leer und eine der folgenden Bedingungen ist wahr (sei c1 das erste Zeichen von g1 und t1 die Zeichenfolge, die die restlichen Zeichen enthält - das gleiche gilt für g2 mit c2 und t2):
    1. c1 und c2 sind gleich und t1 und t2 schneiden
    2. c1 und / oder c2 ist ein Platzhalter und t1 schneidet mit g2
    3. c1 und / oder c2 ist ein Platzhalter und g1 schneidet mit t2

Eine Beispielimplementierung in haskell:

%Vor%

Dieser Algorithmus ist nicht besonders effizient, wenn die Globs viele Platzhalter enthalten, aber es ist sehr einfach zu implementieren und da Sie wahrscheinlich mit Dateinamen arbeiten, bezweifle ich, dass Sie mehr als 1000 Zeichen haben.

    
sepp2k 09.07.2010 13:59
quelle
0

Wie ich verstehe, versuchen Sie festzustellen, ob eine Regex orthogonal zu einer anderen Regex ist? Wenn das so ist, ist das kein sehr triviales Problem.

Hier finden Sie mehr über Theorie

Hier ist die Lösung: Java-Bibliothek.

Verwendung:

%Vor%     
Karol Król 30.07.2013 20:58
quelle
0

Hier ist eine C ++ - Implementierung des von sepp2k vorgeschlagenen Algorithmus mit leichten Modifikationen:

%Vor%     
Heghine 21.07.2015 16:32
quelle
0

Was es wert ist, hier ist eine Implementierung des Algorithmus aus der Antwort von sepp2k in C # (Ich habe explizite return true; und return false; Aufrufe zusammen mit Kommentaren für die Lesbarkeit des Algorithmus verwendet):

%Vor%     
kdawg 19.05.2011 14:47
quelle