Für das von Ihnen genannte Beispiel könnten Sie versuchen, ein Anti-Pattern zu verwenden, um ungültige Ergebnisse zu disqualifizieren. Zum Beispiel würde "^[^a]" Ihnen sagen, dass Ihre Eingabe "c..." nicht mit Ihrem Beispielmuster "aabb" übereinstimmen kann.
Je nach Muster können Sie es in kleinere Muster aufteilen und mehrere Abgleicher verwenden, deren Grenzen Sie dann beim Auftreten einer Übereinstimmung festlegen und zum nächsten übergehen. Dieser Ansatz kann funktionieren, aber wenn Ihr Muster komplex ist und Unterteile mit variabler Länge haben kann, müssen Sie möglicherweise einen Teil des Matchers in Ihrem eigenen Code neu implementieren, um die möglichen Grenzen der Übereinstimmung anzupassen, damit er mehr oder weniger gierig ist. Eine Pseudocode-Idee hierfür wäre:
boolean match(String input, Matcher[] subpatterns, int matchStart, int matchEnd){
matcher = next matcher in list;
int stop = matchend;
while(true){
if matcher.matches input from matchstart -> matchend{
if match(input, subpatterns, end of current match, end of string){
return true;
}else{
//make this match less greedy
stop--;
}
}else{
//no match
return false;
}
}
}
Man könnte diese Idee dann mit den Anti-Mustern zusammenführen und Anti-Teilmuster haben, und nach jeder Teilmusterübereinstimmung das nächste Anti-Muster prüfen, wenn es übereinstimmt, weiß man, dass man gescheitert ist, andernfalls setzt man das übereinstimmende Muster fort. Sie würden wahrscheinlich so etwas wie ein Enum anstelle eines Booleans zurückgeben wollen (d.h. ALL_MATCHED, PARTIAL_MATCH, ANTI_PATTERN_MATCH, ...)
Auch hier hängt es von der Komplexität des eigentlichen Musters ab, das Sie abgleichen wollen, und es kann schwierig, wenn nicht gar unmöglich sein, die entsprechenden Submuster/Antipattern zu schreiben.
1 Stimmen
Welche Regex haben Sie bis jetzt gefunden?
0 Stimmen
Nur um das zu verstehen - Sie sind auf der Suche nach "Regexing fortzusetzen", so zu sprechen, von dem Punkt, den Sie verlassen (ohne Wiederholen der Regex auf die gesamte Zeichenfolge), basierend auf zusätzliche Benutzereingaben? Wenn ja, ist das nicht möglich, aus Gründen, die ich erklären kann, wenn Sie dies bestätigen - es sei denn, Sie geben zusätzliche Einschränkungen.
0 Stimmen
Machen Sie die
bb
Teil optionalaa(bb)?
0 Stimmen
Vielen Dank für die Antworten. Grundsätzlich möchte ich wissen, ob die Zeichenfolge, die ich abzugleichen versuche, mit weiteren Eingaben noch mit dem Muster übereinstimmen kann oder ob sie überhaupt nicht übereinstimmt. Das Muster, das ich habe, kann nur Range [], Sub Range [ - ], * und Digits (/d) und Alpha A,B,C,D haben. Im Grunde jede Kombination von DTMF von der Wähltastatur.
0 Stimmen
Können Sie uns ein konkretes Beispiel für eine Regex geben, die Sie zu verwenden planen? Die meisten Antworten unten erfordern eine Menge Arbeit, wenn Sie sie implementieren wollen, aber vielleicht gibt es in Ihrer konkreten Situation einen einfacheren Weg.
0 Stimmen
@amit, was Sie also wissen wollen, ist, ob beim aktuellen Stand der Eingabe eine zusätzliche Eingabe hinzugefügt werden könnte, so dass der reguläre Ausdruck erfüllt wäre?
0 Stimmen
Übrigens, ich bin ab heute nicht mehr da, aber wenn du auf meinen Kommentar antworten kannst, gebe ich dir eine A+ Antwort, wenn ich zurückkomme ;)
0 Stimmen
@incrediman: Ich frage mich, was du sagen wirst, wenn du morgen wieder zur Arbeit kommst und Alan Moores Antwort liest :)
0 Stimmen
Schön - ich wusste nicht, dass Java diese Funktionalität hat; gut, dass ich gewartet habe :)