Die beste Methode zum Analysieren von durch Leerzeichen getrennten Text

7

Ich habe eine solche Zeichenfolge

%Vor%

Ich möchte es symbolisieren, aber ich kann nicht einfach auf die Leerzeichen aufteilen. Ich habe einen etwas hässlichen Parser gefunden, der funktioniert, aber ich frage mich, ob jemand ein eleganteres Design hat.

Dies ist in C # btw.

BEARBEITEN: Meine hässliche Version, obwohl hässlich, ist O (N) und kann tatsächlich schneller sein als die Verwendung einer RegEx.

%Vor%     
FlySwat 10.09.2008, 18:00
quelle

6 Antworten

16

Der Computerbegriff für das, was Sie tun, ist lexikalische Analyse ; lese das für eine gute Zusammenfassung dieser allgemeinen Aufgabe.

Ich gehe davon aus, dass Sie Ihre Wörter mit Whitespaces voneinander trennen möchten, aber in Anführungszeichen eingeschlossene Dinge sollten als "Wort" ohne die Anführungszeichen behandelt werden.

Der einfachste Weg ist, ein Wort als regulären Ausdruck zu definieren:

%Vor%

Dieser Ausdruck besagt, dass ein "Wort" entweder (1) Nicht-Anführungszeichen, Nicht-Leerzeichen-Text umgeben von Leerzeichen oder (2) Nicht-Anführungszeichen-Text, umgeben von Anführungszeichen (gefolgt von einigen Leerzeichen) ist. Beachten Sie die Verwendung von umschließenden Klammern, um den gewünschten Text hervorzuheben.

Bewaffnet mit dieser Regex ist Ihr Algorithmus einfach: Suchen Sie Ihren Text nach dem nächsten "Wort", wie es von den einfangenden Klammern definiert wird, und geben Sie es zurück. Wiederholen Sie das, bis Ihnen die Wörter ausgehen.

Hier ist der einfachste Code, den ich in VB.NET finden konnte. Beachten Sie, dass wir beide Gruppen auf Daten überprüfen müssen, da es zwei Sätze auffangender Klammern gibt.

%Vor%

Anmerkung 1: Wills Antwort, oben, ist die gleiche Idee wie diese. Hoffentlich erklärt diese Antwort die Details hinter der Szene ein wenig besser:)

    
Todd Myhre 10.09.2008, 18:20
quelle
8

Der Microsoft.VisualBasic.FileIO-Namespace (in Microsoft.VisualBasic.dll) verfügt über einen TextFieldParser, den Sie verwenden können, um nach Leerzeichen zu sortieren. Er behandelt Strings in Anführungszeichen (d. H. "Dies ist ein Token" thisistokentwo).

Beachten Sie, dass die DLL VisualBasic nicht bedeutet, dass Sie sie nur in einem VB-Projekt verwenden können. Es ist Teil des gesamten Framework.

    
Will 10.09.2008 18:03
quelle
3

Es gibt den Ansatz der Zustandsmaschine.

%Vor%

Es kann leicht für Dinge wie verschachtelte Zitate und Escaping erweitert werden. Die Rückgabe als IEnumerable<string> ermöglicht es Ihrem Code, nur so viel zu analysieren, wie Sie benötigen. Es gibt keine echten Nachteile für diese Art von faulen Ansatz, da Strings unveränderlich sind, also wissen Sie, dass sich input nicht ändert, bevor Sie das Ganze analysiert haben.

Siehe: Ссылка

    
fryguybob 10.09.2008 20:12
quelle
0

Sie sollten auch in reguläre Ausdrücke schauen. Das könnte dir helfen. Hier ist ein Beispiel von MSDN abgerissen ...

%Vor%     
Craig 10.09.2008 18:03
quelle
0

Craig hat Recht - verwenden Sie reguläre Ausdrücke. Regex.Split kann für Ihre Bedürfnisse präziser sein.

    
harpo 10.09.2008 18:15
quelle
0
  

[^ \ t] + \ t | "[^"] + "\ t

mit dem Regex sieht definitiv wie die beste Wette aus, aber diese gibt nur die ganze Saite zurück. Ich versuche es zu optimieren, aber bisher nicht viel Glück.

%Vor%     
FlySwat 10.09.2008 19:12
quelle

Tags und Links