Mustererkennung für eine Zeichenfolge, die bereits Platzhalter enthält

8

Ich habe ein Szenario, in dem ich mit einem wild markierten Muster über einer Zeichenfolge suchen möchte, die bereits Platzhalter enthält. In meinen Worten würde ich sagen, es ist eine 2-Wege-Muster-Matching-Anforderung.

Die Eingabe- und Musterzeichenfolge kann eine oder beide der folgenden Platzhalterzeichen haben -? ein einzelnes Zeichen und% repräsentieren null oder mehr Zeichen. Angenommen, dies sind die einzigen 2 Platzhalter, die in der Eingabe und den Musterzeichenfolgen erlaubt sind.

Zum Beispiel:

bool IsMatch (Zeichenfolgeneingabe, Zeichenfolgenmuster) // Sollte True zurückgegeben werden, wenn die Eingabezeichenfolge mit dem Muster übereinstimmt, sollte andernfalls False zurückgegeben werden.

IsMatch ("XYZ%", "? Y%") // Sollte True zurückgeben

IsMatch ("YY?", "? Y%") // Sollte True zurückgeben - Das letzte Zeichen in der Eingabezeichenfolge erwartet ein einzelnes Zeichen, wobei das Muster null oder mehr Zeichen nach Y entspricht (was bedeutet, dass es ein einzelnes Zeichen enthält) Zeichen entsprechen auch)

IsMatch ("X123", "? Y%") // Sollte False zurückgeben - Missing Y in der Eingabezeichenfolge, die das Muster erwartet

IsMatch ("? Y%", "? Y%") // Sollte True zurückgeben

IsMatch ("%", "? Y%") // Sollte True zurückgeben - Die Eingabezeichenfolge hat einen Platzhalter%, der null oder mehr Zeichen darstellt und kann auch beliebige Zeichen haben. In gewisser Weise handelt es sich um ein Muster, das alles repräsentiert, egal welcher Größe.

Ich kann Artikel finden (z. B. Regex), die nur über die Durchführung einer Wildcart-Musterübereinstimmung bei einer Zeichenfolge ohne Wildcards sprechen. Ich suche nach Zeigern / Ideen für den Algorithmus, da es für mich immer schwieriger wird, einen Algorithmus zu entwickeln, der diese Art von Übereinstimmung erzeugt, wenn ich anfange, ihn niederzulegen. Schätzen Sie Ihre Eingaben.

    
PKumar 07.11.2013, 18:10
quelle

1 Antwort

2
___ tag123c ___ C # (sprich "Cis") ist eine objektorientierte Programmiersprache auf hohem Niveau, die für die Erstellung einer Vielzahl von Anwendungen entwickelt wurde, die auf dem .NET Framework (oder .NET Core) ausgeführt werden. C # ist einfach, leistungsfähig, typsicher und objektorientiert. ___ qstnhdr ___ Mustererkennung für eine Zeichenfolge, die bereits Platzhalter enthält ___ tag123wildcard ___ Ein Platzhalterzeichen ist ein beliebiges Zeichen, mit dem ein beliebiges anderes Zeichen oder Zeichen in einer Zeichenfolge ersetzt werden kann. ___ tag123regex ___ Reguläre Ausdrücke stellen eine deklarative Sprache zur Verfügung, um Muster in Strings zu vergleichen. Sie werden häufig für die Überprüfung, Analyse und Umwandlung von Zeichenfolgen verwendet. Da reguläre Ausdrücke nicht vollständig standardisiert sind, sollten alle Fragen mit diesem Tag auch ein Tag enthalten, das die anwendbare Programmiersprache oder das entsprechende Werkzeug angibt. HINWEIS: Nach HTML-, JSON-, usw.-Regexen zu fragen, neigt zu negativen Reaktionen. Wenn es einen Parser dafür gibt, verwende stattdessen diesen. ___ qstntxt ___

Ich habe ein Szenario, in dem ich mit einem wild markierten Muster über einer Zeichenfolge suchen möchte, die bereits Platzhalter enthält. In meinen Worten würde ich sagen, es ist eine 2-Wege-Muster-Matching-Anforderung.

Die Eingabe- und Musterzeichenfolge kann eine oder beide der folgenden Platzhalterzeichen haben -? ein einzelnes Zeichen und% repräsentieren null oder mehr Zeichen. Angenommen, dies sind die einzigen 2 Platzhalter, die in der Eingabe und den Musterzeichenfolgen erlaubt sind.

Zum Beispiel:

bool IsMatch (Zeichenfolgeneingabe, Zeichenfolgenmuster) // Sollte True zurückgegeben werden, wenn die Eingabezeichenfolge mit dem Muster übereinstimmt, sollte andernfalls False zurückgegeben werden.

IsMatch ("XYZ%", "? Y%") // Sollte True zurückgeben

IsMatch ("YY?", "? Y%") // Sollte True zurückgeben - Das letzte Zeichen in der Eingabezeichenfolge erwartet ein einzelnes Zeichen, wobei das Muster null oder mehr Zeichen nach Y entspricht (was bedeutet, dass es ein einzelnes Zeichen enthält) Zeichen entsprechen auch)

IsMatch ("X123", "? Y%") // Sollte False zurückgeben - Missing Y in der Eingabezeichenfolge, die das Muster erwartet

IsMatch ("? Y%", "? Y%") // Sollte True zurückgeben

IsMatch ("%", "? Y%") // Sollte True zurückgeben - Die Eingabezeichenfolge hat einen Platzhalter%, der null oder mehr Zeichen darstellt und kann auch beliebige Zeichen haben. In gewisser Weise handelt es sich um ein Muster, das alles repräsentiert, egal welcher Größe.

Ich kann Artikel finden (z. B. Regex), die nur über die Durchführung einer Wildcart-Musterübereinstimmung bei einer Zeichenfolge ohne Wildcards sprechen. Ich suche nach Zeigern / Ideen für den Algorithmus, da es für mich immer schwieriger wird, einen Algorithmus zu entwickeln, der diese Art von Übereinstimmung erzeugt, wenn ich anfange, ihn niederzulegen. Schätzen Sie Ihre Eingaben.

    
___ antwort19853575 ___

Wie ich in meinem Kommentar für die allgemeinsten Fälle geschrieben habe, müßtest du den minimalen deterministischen endlichen Automaten der beiden Ausdrücke erzeugen und die beiden Automaten vergleichen. Nachdem gesagt wurde, dass es eine Bruteforce / Poorman Lösung für Ihre Frage geben könnte.

Anhand Ihrer Beispiele klingt es so, als ob Sie daran interessiert sind, zu sehen, ob eines von Eingabe / Muster mit allen Strings übereinstimmt, die vom anderen generiert wurden.

%Vor%

Sie können überprüfen, ob input tatsächlich mit einer Teilmenge von Zeichenfolgen übereinstimmt, die von pattern generiert wurden, solange

  • kannst du dich wirklich auf% beschränken und? Operatoren wie angegeben
  • Ihre Eingabe- / Musterzeichenfolgen sind ziemlich kurz - genauer gesagt, das Auftreten von% in einer Eingabe oder einem Muster ist kleiner als etwa 20 oder so.

Die Grundidee besteht darin, eine Liste von repräsentativen Strings für input zu generieren und diese mit Patterns mit der von Ihnen bevorzugten Regex-Engine zu vergleichen. Wenn alle Repräsentanten übereinstimmen - input stimmt mit einer Untermenge von pattern überein. Dieser Algorithmus für IsSubset kann wie folgt beschrieben werden:

%Vor%

zum Beispiel, wenn die Eingabe ist? X% YZ% und die pattern enthält nicht das Zeichen A die Liste wäre generiert     AXYZ
    AXYZA
    AXAYZ
    AXAYZA

Es ist leicht zu sehen, dass die Anzahl der Strings in dieser Liste 2 ^ n ist, wobei n die Anzahl von '%' in der Eingabe ist.

Auch ist es einfach, die Reihenfolge der Argumente zu vertauschen und umgekehrt die Beziehung herauszufinden. Also in Wirklichkeit dein

%Vor%     
___
hawk 08.11.2013, 07:19
quelle

Tags und Links