Zurück   Flashforum > Flash > ActionScript > ActionScript 3

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 20-01-2012, 19:19   #1 (permalink)
AS Programmer
 
Benutzerbild von Mattcheck
 
Registriert seit: Dec 2009
Beiträge: 36
Regulärer Ausdruck: Zahl nach einem Komma ignorieren

Schönen Guten Abend!

Ich beschäftige mich gerade mit Regulären Ausdrücken und komme an einer Stelle nicht weiter. Ich habe einen String, den ich bei jedem Kommatar unterteilen möchte. Hier ein Beispiel:

Code:
var a:String = "Hallo, Hello, Bonjour, ciao
Das "Hallo" am Anfang ist irrelevant. Der Reguläre Ausdruck für dieses Beispiel wäre:

Code:
var regKomma:RegExp = /,[^,]*/g;
Dieser würde folgendes ausgeben.
Code:
, Hello
, Bonjour
, ciao
Bis dahin habe ich auch keine Probleme. Jetzt möchte ich aber, dass Dezimalzahlen, die mit einem Komma getrennt werden ignoriert werden von der Trennung. Hier ein Beispiel:
Code:
var a:String = "Hallo, 3, 4,5, 5
Der Reguläre Ausdruck soll folgendes zurückgeben:
Code:
, 3
, 4,5
, 5
Allerdings verstehe ich nicht wie man das mit in die Bedingung einbringt.
Ich habe es so probiert:
Code:
var regKomma:RegExp = /,\D[^(,\D)]*/g;
Allerdings hat es nicht funktioniert.

Könnt ihr mir evtl. weiterhelfen?

Vielen Danke schonmal im vorraus!
Gruß Matti
Mattcheck ist offline   Mit Zitat antworten
Alt 21-01-2012, 00:33   #2 (permalink)
Keine Panik
 
Registriert seit: Apr 2010
Ort: Düsseldorf (im ernst)
Beiträge: 1.868
das ist aus mehreren Gründen doof:
- trennzeichen sollten im Content nicht verwendet werden, das führt wie du siehst zu Problemen.
- "4,5" sollte direkt 4.5 lauten; in allen (mir bekannten) Programmiersprachen wird der Punkt als Dezimaltrennzeichen verwendet
- wenn du dich mit regulären Ausdrücken beschäftigen willst: gut, aber für diesen konkreten Fall wäre ein split(", ") simpler und performanter
oder auch split(/,\s+/g)

Code:
/(?<=,\s|^)\s*(.+?)\s*(?=,\s|$)/g
/(?<=,|^)\s*(.+?)\s*(?=,\s+|$)/g
/\s*(.+?)\s*(?:,\s|$)/g
und sicher noch ein gutes halbes dutzend Möglichkeiten das zu verfeinern.

In allen drei Fällen ist die 1. Gruppe, die interessante.
__________________
greetz Thomas

plz RTFM & Coding Conventions
thomas_E ist gerade online   Mit Zitat antworten
Alt 21-01-2012, 02:23   #3 (permalink)
AS Programmer
 
Benutzerbild von Mattcheck
 
Registriert seit: Dec 2009
Beiträge: 36
Es ist auch sehr unüblich die Dezimalzahlen mit einem Komma zu trennen.

Das Problem das ich habe ist, dass ich den String nicht selbst vorgebe, sondern der String kommt von einem DME (Digitalen Melde Empfänger), der für Feuerwehren und das Technische Hilfswerk bzw. DLRG eingesetzt wird.
Dabei wird die Einsatzmeldung in verschiedene Teile aufgeteilt.
Das heißt der Einsatzort und der Einsatzvorfall den die Leitstelle durchgibt, sind über ein Komma getrennt.

Wenn jetzt aber die Leitstelle eine Wegbeschreibung über eine Kilometerangabe an einer Autobahn oder Bundestraße tätigt, soll das nicht automatisch eine einteilung sein, sondern soll zu dem Einsatzort gehören.

Ich meine nur damit, dass ich keinen Einfluss auf den Text habe, sondern das was die Leitstelle eintippt in dem String landet und leider trennen nicht alle Disponenten eine Dezimalzahl mit einem Punkt.

Vielen Dank schonmal für die Bemühung, ich werde die einzelnen Ausdrücke morgen probieren und sagen ob es funktioniert hat.

Gruß
Matti
Mattcheck ist offline   Mit Zitat antworten
Alt 21-01-2012, 09:17   #4 (permalink)
Flash-Designer
 
Benutzerbild von Martin Kraft
 
Registriert seit: May 2006
Ort: Wiesbaden
Beiträge: 6.162
Wenn die Eingaben so unsicher sind, würde ich ein anderes Trennzeichen verwenden als ein simples Komma! Kommas kommen so oft vor, dass das Fehlerrisiko IMHO viel zu hoch ist.

Wer oder was kodiert denn die Zeilen und setzt die Trennzeichen?
__________________
Viele Grüße // Martin

Martin Kraft // Interaktionsdesign

Hilfreiche Websites:
// Hilfe zur Adobe Flash Plattform
// ActionScript 2 Referenz
// ActionScript 3 Referenz
// ActionScript 3 Arbeitshandbuch
// weitere Flash Ressourcen

Bitte keine Flashfragen per PM oder Profilnachricht! Dafür ist das Forum da!
Martin Kraft ist gerade online   Mit Zitat antworten
Alt 22-01-2012, 20:29   #5 (permalink)
AS Programmer
 
Benutzerbild von Mattcheck
 
Registriert seit: Dec 2009
Beiträge: 36
Leider habe ich darauf keinen Einfluss. Der DME kodiert das Signal, welches von der Leitstelle gesendet wird. Über einen Socket empfange ich diesen String und die einzelnen Kategorien sind leider über Kommas getrennt.

Ich hätte die Trennung auf keinen Fall mit Kommas gemacht. Aber wie gesagt, das kann ich leider nicht ändern, deswegen muss ich damit leider leben und das beste draus machen.
Mattcheck ist offline   Mit Zitat antworten
Alt 22-01-2012, 21:15   #6 (permalink)
Keine Panik
 
Registriert seit: Apr 2010
Ort: Düsseldorf (im ernst)
Beiträge: 1.868
dann würde ich versuchen mehr auf die Struktur des gesamten Datensatzes einzugehen (wenn es eine gibt ), und so quasi "Textblöcke" zu erkennen.

bspw:
"1234, name, text mit komma, Punkt, und weiss was sonst noch, datum"

da kannst du den Text in der Mitte anhand der Blöcke davor und dahinter identifizieren, und kannst so die Kommas darin ignorieren/einbeziehen.

dadurch wird der reguläre Ausdruck zwar "endlos" lang, aber auch zuverlässiger.
dafür müsstest du/ich mehr Infos über den Aufbau dieses Datensatzes haben, und wie die einzelnen Felder aufgebaut sind/welche Zeichen darin vorkommen können.

wichtig sind dabei so Dinge wie rein numerische Felder, rein alphanumerische, felder mit konstanter länge, oder welche die du irgendwie so genau wie möglich beschreiben kannst: bspw eine Adresse (einfach)
/\s*([a-z-_.\s]+?[0-9]+\s*[a-z]?)\s*/gi
Eine Buchstabenfolge incl Bindestrich, unterstrich, Punkt und Leerzeichen,
gefolgt von der Hausnummer, evtl kein, ein oder mehrere Leerzeichen (bspw zum Strukturieren) und evtl noch ein Buchstabe (wie in Hausnummer 15A)

wenn du dieses Feld erkennen kannst, weisst du was in dem Feld davor und dahinter steht!
__________________
greetz Thomas

plz RTFM & Coding Conventions
thomas_E ist gerade online   Mit Zitat antworten
Alt 23-01-2012, 13:55   #7 (permalink)
AS Programmer
 
Benutzerbild von Mattcheck
 
Registriert seit: Dec 2009
Beiträge: 36
Ein Beispiel einer Einsatzmeldung so wie sie in Actionscript ankommt wäre diese:

Code:
20:56 28.12.11 02B H2Y, , Grundschule ,Schulstraße,-,Neustadt, , , WOHNUNGSBRAND
Ich Actionscript überprüfe ich auch erst, aus wievielen Kommatar der String besteht. Sind es wie üblich 8, dann ist es kein Problem die einzelnen Felder herauszuziehen.

Aufgebaut ist es immer gleich.
Vor dem ersten Komma da Alarmierungsstichwort.
Nach dem ersten Komma weiß ich leider nicht (bis jetzt immer leer), danach der Text ist das Einsatzobjekt. Hier ist es nicht möglich, dass sich dort ein Komma befindet, dann die Ortsangabe (eig. nur Straßennamen), dann der Ortsteil (war noch nie ein Komma drin), dann kommt der Ort (auch ohne Komma), dann ein Feld was auch noch nie benutzt wurde, dann der Ortszusatz (hier sind Komma möglich wie z.B. Kilometerangaben, die sich auf die Ortsangabe beziehen) und als letzes Feld die Einsatzart (hier sind auch Kommatar möglich wie z.B. "ZIMMERBRAND, PERSON IM BEBÄUDE")

D.h. nur in den letzten Beiden Felden können sich Kommas befinden.
Hier zwei Beispiele mit mehr als den 8-Standart Kommas:

Code:
20:56 28.12.11 03B B1, , ,B34 Neustadt -> Altstadt,-,Neustadt, , KM 23,9, BRENNT PKW
20:56 28.12.11 03B UEB, , ,Hauptstraße 72,-,Münchenhagen, , , ZIMMERBRAND, PERSON IM BEBÄUDE
Mattcheck ist offline   Mit Zitat antworten
Alt 23-01-2012, 14:35   #8 (permalink)
Keine Panik
 
Registriert seit: Apr 2010
Ort: Düsseldorf (im ernst)
Beiträge: 1.868
also zwei freitext Felder hintereinander. Das ist ein Problem. ich hatte gehofft, dass die irgendwie einzeln vorkommen, und man so Anfang und Ende bestimmen kann, weil im schlimmsten Fall:
Code:
KM 27,3, hinter der Mühle, Massenkarambolage, mehrere Personen schwer verletzt, Explositionsgefahr
wie willst du da die beiden Felder unterscheiden? hier hast du 5 Kommas, und nur einer ist der richtige.
die ersten 6 Felder scheinen ja gut zu erkennen zu sein, nur die letzten beiden stellen ein Problem dar.

Im Moment hab ich da keine Idee zu.
__________________
greetz Thomas

plz RTFM & Coding Conventions
thomas_E ist gerade online   Mit Zitat antworten
Alt 23-01-2012, 16:31   #9 (permalink)
Flash-Designer
 
Benutzerbild von Martin Kraft
 
Registriert seit: May 2006
Ort: Wiesbaden
Beiträge: 6.162
Genau das war genau der Grund für meine Frage. Wenn solche Probleme nicht bereits bei der Eingabe abgefangen bzw. kodiert werden, ist man beim Verarbeiten mit Flash chancenlos!

Deshalb mochmal: Liegen die Daten an der Quelle tatsächlich nur als ein durchgängiger String vor? D.h. gibt der Nutzer selbst die Trennkommas ein, so dass tatsächlich nur ein Feld in der Datenbank steht?
  • Wenn ja, dann ist dass (zumal in einem so sicherheitskritischen Bereich, wie bei der Feuerwehr) fast schon fahrlässig schlecht designt!
    Sowas zuverlässig zu verarbeiten, das schafft kein regulärer Ausdruck, das geht (wennn es überhaupt möglich ist) schon deutlich in Richtung Künstliche Intelligenz.

  • Wenn nein (also getrennte Felder eingegeben werden), solltest Du darum bitten, diese so zu kodieren, dass es keine Überschneidung mit dem Trennzeichen gibt, oder ein anderes Trenzeichen verwendt wird.
__________________
Viele Grüße // Martin

Martin Kraft // Interaktionsdesign

Hilfreiche Websites:
// Hilfe zur Adobe Flash Plattform
// ActionScript 2 Referenz
// ActionScript 3 Referenz
// ActionScript 3 Arbeitshandbuch
// weitere Flash Ressourcen

Bitte keine Flashfragen per PM oder Profilnachricht! Dafür ist das Forum da!

Geändert von Martin Kraft (23-01-2012 um 16:44 Uhr)
Martin Kraft ist gerade online   Mit Zitat antworten
Alt 23-01-2012, 23:25   #10 (permalink)
Keine Panik
 
Registriert seit: Apr 2010
Ort: Düsseldorf (im ernst)
Beiträge: 1.868
Zitat:
Deshalb mochmal: Liegen die Daten an der Quelle tatsächlich nur als ein durchgängiger String vor? D.h. gibt der Nutzer selbst die Trennkommas ein, so dass tatsächlich nur ein Feld in der Datenbank steht?
ich gehe schon davon aus, das da ein vernünfriges Backend hinter steht. ich vermute eher das Problem ist die (Web-)Schnittstelle auf die er hier zurückgreifen muss.

Zitat:
zumal in einem so sicherheitskritischen Bereich, wie bei der Feuerwehr
ich kann mir kaum vorstellen, dass die Feuerwehr mit einer Flashanwendung arbeitet. hoffe ich wenigstens
da werd ich aber auch neugierig, wofür das ganze dann sein soll.

Mattcheck@
PHP-Code:
//String bereinigen
str str.replace(/(d+)s*,s*(d+)/g"$1.$2"); 
das sollte die Dezimaltrennzeichen zuverlässig zu Punkten ändern
Damit hättest du ein Problem weniger.

Gibt es eigentlich eine Definition zu dem Feld "Ortszusatz", also was da logisch drinstehen soll(te). ich mein nicht den Zeichensatz.
kommen da nur solche Kilometerangaben drin vor, oder evtl noch andere Angaben mit Kommas drin?
__________________
greetz Thomas

plz RTFM & Coding Conventions
thomas_E ist gerade online   Mit Zitat antworten
Alt 25-01-2012, 11:44   #11 (permalink)
AS Programmer
 
Benutzerbild von Mattcheck
 
Registriert seit: Dec 2009
Beiträge: 36
@Martin Kraft
In der Leistelle werden die einzelnen Felder über eine Maske eingeben. Gespeichert werden die dort denke ich auch in einer Datenbank. Wenn jetzt der Einsatz allerdings abgeschickt wird, landen die ganzen Felder auf dem Pieper als ein zusammenhängender Text der nur durch die Kommas getrennt wird.

Wir wollen lediglich eine Air-Applikation laufen lassen, die über einen Socket auf den Pieper zugreift und die Meldungen empfängt. Dies ist der Sting von dem ich gesprochen habe. Dann soll die Meldung geordnet auf einem Bildschirm angezeigt werden, daher auch die Teilung des Textes.

@thomas_E
Die Trennung von Dezimalzahlen ist dann also kein Problem mehr. Das ist super! Und zum Orstszusatz kann ich nur sagen, dass bis jetzt nur Kilometerangaben dort drin sind. Dann könnte man das ja so machen, dass man den ganzen Text nach dem siebten Komma nimmt und den als Einsatzvorfall speichert.
Mattcheck ist offline   Mit Zitat antworten
Alt 25-01-2012, 11:59   #12 (permalink)
Flash-Designer
 
Benutzerbild von Martin Kraft
 
Registriert seit: May 2006
Ort: Wiesbaden
Beiträge: 6.162
Zitat:
Zitat von Mattcheck Beitrag anzeigen
In der Leistelle werden die einzelnen Felder über eine Maske eingeben. Gespeichert werden die dort denke ich auch in einer Datenbank.
Dann müsste es auch möglich sein, sie ordentlich und vorallen eindeutig formatiert auszugeben?!
Zitat:
Zitat von Mattcheck Beitrag anzeigen
Wenn jetzt der Einsatz allerdings abgeschickt wird, landen die ganzen Felder auf dem Pieper als ein zusammenhängender Text der nur durch die Kommas getrennt wird.
Und es ist wirklich nicht möglich bei der Ausgabe an den Pieper ein anderes Zeichen (z.B: ein »|« statt eines »,«) zu verwenden? Das dürfte ja auch für »analoge« Ableser etwas klarer sein (wie Thomas' Beispiel zeigt).
Zitat:
Zitat von Mattcheck Beitrag anzeigen
Wir wollen lediglich eine Air-Applikation laufen lassen, die über einen Socket auf den Pieper zugreift und die Meldungen empfängt. Dies ist der Sting von dem ich gesprochen habe. Dann soll die Meldung geordnet auf einem Bildschirm angezeigt werden, daher auch die Teilung des Textes.
interessantes Setup
  • Mit Pieper meinst Du sowas?
  • Da ich mal nicht davon ausgehe, dass Air-Apps auf solchen Geräten nicht laufen, vermute ich, dass Ihr dafür ein zweites Gerät (also ein Smartphone, Tablet oder Laptop) habt, das irgendwie (USB?) mit diesem Pieper verbunden ist?
  • Wär's nicht einfacher über dieses Gerät direkt mir der Datenbank bzw. einem entsprechenden Backend zu kommunizieren?
__________________
Viele Grüße // Martin

Martin Kraft // Interaktionsdesign

Hilfreiche Websites:
// Hilfe zur Adobe Flash Plattform
// ActionScript 2 Referenz
// ActionScript 3 Referenz
// ActionScript 3 Arbeitshandbuch
// weitere Flash Ressourcen

Bitte keine Flashfragen per PM oder Profilnachricht! Dafür ist das Forum da!

Geändert von Martin Kraft (25-01-2012 um 12:07 Uhr)
Martin Kraft ist gerade online   Mit Zitat antworten
Alt 25-01-2012, 12:31   #13 (permalink)
AS Programmer
 
Benutzerbild von Mattcheck
 
Registriert seit: Dec 2009
Beiträge: 36
Die Leistelle, die die Daten eintippt sitzt 17 Kilometer entfernt, d.h. sie schickt den Text ab und er kommt auf einem DME an (Datei:Swissphone DE900-03.jpg) -> genau diesen meine ich. An der Unterseite gibt es einen RX, TX und GND Pin über den wir per serieller Schnittstelle an unseren PC im Gerätehaus gehen. Der Socket der Air Datei liest den PORT aus und wenn etwas an kommt soll er den Text "entschlüsseln"

Also ja wir benutzen einen Laptop, der per USB Kabel mit dem DME (Digitaler Melde Empfänger) verbunden ist. Und leider gibt der Melder genau die Nachricht aus die ihm per Funk zugesandt wurde. Das heißt, die Trennung mit den Kommas übernimm tnicht der DME sondern die Leistelle.

Zusammenfassend: Die einzige Möglichkeit, die wir haben ist mittels Einsatzmeldung an die Daten zu gelangen. Und das ist der Text, den der Pieper ausgibt. Wie der Text aussieht und wie er kodiert, getrennt wird entscheidet die Leitstelle auf die wir leider keinen Einfluss haben.
Mattcheck ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Stichworte
ausdrücke, komma, regexp, reguläre, reguläre ausdrücke

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
regulärer ausdruck. boreker PHP und MySQL 3 27-08-2007 19:01
regulärer ausdruck lixx PHP und MySQL 1 21-06-2006 11:59
Zahl auf 2 Dezimalstellen nach Komma ausgeben groovesurfer Flash 4 und Flash 5 3 13-12-2003 21:19
ZAHL RUNDEN auf 2 stellen nach komma? kendal Flash MX 2 14-03-2003 20:09
3. Zahl nach dem Komma.. aufrunden Julian Graw ActionScript 1 2 19-12-2001 21:46


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:35 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele