Überprüfen, ob ein string enthält nur ein Wort, doch nur in bestimmter position?
Wie kann ich überprüfen, ob ein string enthält einen substring, aber nur in einer bestimmten position?
Beispiel-string:
Was ist Ihre Lieblings - Farbe? meine [Lieblings -] - Farbe ist blau
Wenn ich wollte, um zu überprüfen, ob der string enthalten ein bestimmtes Wort, das ich in der Regel tun dies:
var
S: string;
begin
S := 'What is your favorite color? my [favorite] color is blue';
if (Pos('favorite', S) > 0) then
begin
//
end;
end;
Was ich brauche ist, um zu bestimmen, wenn das Wort Lieblings - besteht in der Zeichenfolge zu ignorieren, aber wenn es erscheint, innerhalb der [ ] - Symbol, das in den obigen code-Beispiel eindeutig nicht tun.
Also, wenn wir den code in einen boolean-Funktion, die einige Beispiel-Ergebnisse würden wie folgt Aussehen:
WAHR: Was ist Ihre Lieblings - Farbe? meine [meine Lieblings -] - Farbe ist blau
WAHR: Was ist Ihre Lieblings - Farbe? meine [bla bla] - Farbe ist blau
FALSCH: Was ist Ihre bla bla Farbe? meine [einige Lieblings -] - Farbe ist blau
Den ersten beiden Beispielen oben sind wahr, weil das Wort Favorit ist außerhalb des [] - symbols, ob es innerhalb oder nicht.
Dem 3. Beispiel ist falsch, weil, obwohl es ist das Wort, Liebling, es wird nur angezeigt in der [ ] Symbole - wir sollten nur prüfen, ob es existiert außerhalb der Symbole zu stellen.
Also brauche ich eine Funktion, um zu bestimmen, ob oder nicht ein Wort (Favorit in diesem Beispiel) wird in einem string, aber ignorieren die Tatsache, ob das Wort umgeben ist, innen [ ] Symbole.
\s
und lassen für das 4. element. 2) Überprüfen Sie für ` Liebling ` (beachten Sie die Leerzeichen um das Wort). 3) teilen Sie die Zeichenfolge auf das Fragezeichen ?
und dann prüfen, ob es hält favorite
.Suche nach '[', wenn gefunden Suche ']', löschen Sie die in-zwischen, darunter '[]', Suche für den Favoriten.
Oder einen regulären Ausdruck verwenden (mit Einheiten im XE) mit einem regex der
'\b' + wordtofind + '\b'
. Die einzige Sache, die Sie achten müssen ist Is it your favorite?
, wo die ?
würde es nicht passen.Erweitern @Ken Ahnung von regex,
this
möglicherweise eine inspiration.InformationsquelleAutor | 2012-09-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich mag
Sertac Idee
zum löschen von strings in Klammern eingeschlossen und auf der Suche nach einer Zeichenfolge danach. Hier ist ein code-Beispiel erweitert, indem eine Suche auf ganze Wörter und die groß-und Kleinschreibung:Hier ist eine optimierte version der Funktion, die verwendet Zeiger char iteration ohne string-manipulation. Im Vergleich zu einer früheren version dieses behandelt den Fall, wenn Sie eine Zeichenfolge, die mit einer fehlenden schließenden Klammer, wie zum Beispiel
My [favorite color is
. Eine solche Zeichenfolge ist es Wahr ausgewertet, da der fehlende Klammer.Das Prinzip ist, gehen Sie durch den ganzen string char durch char und wenn, finden Sie die öffnende Klammer, schau mal ob die Halterung hat einen schließen-pair-Mädchen für sich. Wenn ja, dann überprüfen Sie, ob der substring von der gespeicherten position, bis die öffnende Klammer enthält das gesuchte Wort. Wenn ja, beenden Sie die Funktion. Wenn nicht, verschieben Sie die gespeicherte position auf die schließende Klammer. Wenn die öffnende Klammer nicht über einen eigenen schließen-pair-Mädchen, suchen Sie nach dem Wort aus der gespeicherten position bis zum Ende der gesamten Zeichenfolge und die Funktion beenden.
Für die kommentierte version dieses code Folgen Sie diesem link.
Danke! Trotzdem, regex ist der richtige Weg, das zu tun, was Sie brauchen (und sicherlich einfacher), aber auf der anderen Seite, das ist mehr, gerade nur auf diese spezifische Aufgabe (und effizienter ich würde sagen, da regex mindestens benötigt, um eine Analyse der expression, bevor Sie beginnt zu passen). Ich würde sagen, wenn du nicht gehst, zu bauen, einige parser zum Beispiel, wo würden Sie viele ähnliche Aufgaben wie diese übereinstimmen, dann ist diese Lösung vielleicht leichter als einschließlich regex. Aber der Hauptgrund, warum ich gebucht habe, ist, dass keine der Antworten hier verwendete Reine Delphi.
InformationsquelleAutor TLama
In reguläre Ausdrücke, es ist ein Ding namens look-rund die Sie nutzen könnten. In Ihrem Fall kann man es lösen mit negativen lookbehind: Sie wollen "Lieblings" - es sei denn es geht mit einer öffnenden Klammer. Es könnte wie folgt Aussehen:
Schritt für Schritt:
(?<!
ist die negative lookbehind-Präfix, wir suchen für\[
Optional gefolgt von keinem oder mehr Dinge, die sind nicht schließende oder öffnende Klammer:[^\[\]]*
haben, schließen Sie das negative lookbehind mit)
, und dannfavorite
direkt nach.InformationsquelleAutor Stijn Sanders
Denke ich, kann man formulieren Sie Ihr problem als "finde eine Eintritt des mitgelieferten string nicht umgeben von eckigen Klammern." Wenn dieser beschreibt Ihr Problem, dann können Sie voran gehen und verwenden Sie einen einfachen regulären Ausdruck wie
[^\[]favorite[^\]]
.InformationsquelleAutor Leonardo Herrera