Gute Praktiken zum Parsen von Benutzereingaben mit Sonderzeichen?

8

Grüße, ich bin der Programmautor für die Rebellion gegen das böse galaktische Imperium. Gerade jetzt bereiten wir uns auf einen mutigen Angriff auf den Todesstern vor.

Ich habe eine riesige Datenbank mit Informationen über unsere Piloten, Droiden und Systeme an Bord unserer X-Wing und Y-Wing Kämpfer erstellt, die bald den Todesstern angreifen werden. Aufgrund unserer kritischen Anforderungen für einen schnellen Zugriff auf die Informationen habe ich ein System entwickelt, bei dem ein Benutzer eine Textfolge eingeben kann, um anzugeben, welche Daten abgerufen werden sollen.

Es gibt zahlreiche Felder, nach denen der Benutzer suchen kann. Wenn ein Benutzer beispielsweise Daten zu R2D2 finden möchte, könnte er die Abfrage "DROID: R2D2" eingeben und diese Daten schnell finden. Wenn er die Daten über alle Piloten, Droiden und Systeme für Red Team benötigt, könnte er "TEAM: RED TEAM" eingeben.

Das System ist jedoch auf komplexere Abfragen ausgelegt. Wie Sie aus der vorherigen Abfrage sehen können, sind der Datenfeldname und der Datenwert durch einen Doppelpunkt : getrennt. Die Benutzer müssen in der Lage sein, mehrere Werte pro Feld zu durchsuchen und mehrere Felder gleichzeitig zu durchsuchen.

Hier ist eine Abfrage, die für meine fortgeschritteneren Benutzer typisch ist: "SHIPTYPE: X-WING, Y-WING; STANDORT: Docking-Schacht 94; DROIDTYPE: R2"

Ich bin ziemlich glücklich damit, wie ich das gehandhabt habe. Ich benutze die Funktion String.Split(';') , um die Werte der drei Datenfelder zu lesen, die der Benutzer ausgewählt hat. Ich verwende String.Split(':') to seperate the data field name from the value, and then I user String.Split (',') ', um die verschiedenen Feldwerte zu erhalten, bei denen der Benutzer mehrere eingegeben hat. Sie können sehen, wie das funktioniert.

Allerdings gibt es ein Problem. Prinzessin Leiah (Sie wissen, wie pingelig sie ist) besteht darauf, ':', ';' und ',' in ihren Blaster-Kalibrierungsaufzeichnungen zu verwenden. Wenn sie versucht, diese Daten abzufragen, sind ihre Abfragen für mein Programm unverständlich. Sie sagt, dass der Todesstern die Rebellenbasis bald zerstören wird, wenn dieses Problem nicht korrigiert wird.

Deshalb bitte ich Sie um Hilfe beim Vorschlagen guter Praktiken zum Analysieren von Benutzereingaben. Wie kann ich mein Programm für Prinzessin Leiah arbeiten lassen?

Update Ich werde über die Antwort auf meine Frage spekulieren. Als ich lernte, in C-aromatisierten Sprachen zu programmieren, lernte ich "Escape-Sequenzen", wo ich in meinen String-Literalen ein normalerweise reserviertes Zeichen angeben kann. (zB "A" -Zeichen beendet normalerweise ein String-Literal, aber ich kann es "entkommen" mit ") Ich vermute, dass es eine gute Idee wäre, etwas zu tun, das meinem Programm ähnlich ist, aber ich weiß nicht, was würde der beste Weg, um es zu erreichen. Bevor ich mich auf diesen Todessternangriff vorbereitete, war die meiste Programmiererfahrung die binäre Sprache der Feuchtigkeitsvaporatoren, also ist das neu für mich.

    
Daniel Allen Langdon 28.02.2011, 16:14
quelle

3 Antworten

2

Es tut mir leid, aber die Beschreibung von Star Wars hat nicht geholfen, deine Frage zu klären.

Jedenfalls habe ich viel Parsing-Code geschrieben. Ich interessiere mich nicht für String.Split() , es sei denn, die Daten werden immer nur so formatiert. Es gibt eine Allzweck-Parser-Klasse in Ссылка . Ich würde wahrscheinlich so etwas verwenden, um einen flexibleren Parser zu implementieren.

    
Jonathan Wood 28.02.2011, 16:19
quelle
3

Ähnlich wie Google könnten Sie auch zulassen, dass Suchbegriffe in "Marken" eingeschlossen werden. Sie würden also Folgendes zulassen:

SCHIFFTYP: "BATTLESTAR: GALACTICA"; LAGE: Andockstation 94; DROIDTYPE: R2

    
Jon Egerton 28.02.2011 16:24
quelle
2

Es scheint, dass Sie Keywords auf der linken Seite des Trennzeichens und den tatsächlichen Abfragewert auf der rechten Seite des Trennzeichens verwenden. Sie könnten etwas versuchen, bei dem Sie überprüfen, ob das word , das zwischen ; und : enthalten ist, ein tatsächliches Schlüsselwort ist. Wenn dies nicht der Fall ist, ignorieren Sie das Trennzeichen an diesem Punkt.

Aber das wird nicht einfach sein, noch wird es nur mit String.Split()

funktionieren     
msarchet 28.02.2011 16:24
quelle

Tags und Links